Посты в Скрипты
IT.Tux.Droid 05.04.2011 20:12

СкриптыProstoScript для ProstoPleer’a.

prostoscript.py – умеет создавать плейлисты и/или полностью скачивать музыку из Ваших плейлистов на ProstoPleer’е и топа радиостанций ProstoPleer’а.
  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
 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
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# coding: utf-8

######################################################
#                                                    #
#         ProstoScript для ProstoPleer'a =)          #
#   Code by IT.Tux.Droid <http://it-tux-droid.ru/>   #
#                                                    #
######################################################

import pycurl, StringIO, re, os, progressbar
from optparse import OptionParser

data = StringIO.StringIO()
curl = pycurl.Curl()
curl.setopt(pycurl.WRITEFUNCTION, data.write)

parser = OptionParser()
parser.add_option('-m', '--mode', dest='mode', metavar='MODE', default='0',
                  help='select mode: 0 - create playlist, 1 - download songs, 2 - create playlist and download songs')
parser.add_option('-u', '--url', dest='url', metavar='URL',
                  help='url to playlist or radio: http://prostopleer.com/#/top/msk/nasheradio')
(options, args) = parser.parse_args()

def progress(download_t, download_d, upload_t, upload_d):
        if (download_t != 0) and (download_d != download_t):
                bar.update((int(download_d)*100)/int(download_t))

def error(text):
        z = len(text.decode('utf-8'))
        print ' ????????????????'+'?'*z
        print ' ?       '+text+'       ?'
        print ' ????????????????'+'?'*z

def download_mp3(folder, song, url):
        global bar
        print '? '+song
        if not os.path.exists(folder):
                os.makedirs(folder)
        if not os.path.exists(folder+'/'+song+'.mp3'):
                bar = progressbar.ProgressBar(maxval=100, widgets=<'?   ?', progressbar.Bar(left='<', marker='=', right='>')>).start()
                data.truncate(0)
                curl.setopt(pycurl.URL, 'http://prostopleer.com/download/'+url)
                curl.setopt(curl.PROGRESSFUNCTION, progress)
                curl.setopt(curl.NOPROGRESS, 0)
                try:
                        curl.perform()
                except:
                        print '?   ?<connection error="error">'
                        return False
                bar.finish()
                mp3 = open(folder+'/'+song+'.mp3', 'w')
                mp3.write(data.getvalue())
                mp3.close()
        else:
                print '?   ?<you already="already" have="have" it="it">'

# Create .m3u playlist and/or download songs from your playlist.
# Example: "playlist('list346790Ntwn', 2)".
def playlist(p, m):
        data.truncate(0)
        curl.setopt(pycurl.URL,'http://prostopleer.com/'+p)
        curl.setopt(curl.NOPROGRESS, 1)
        try:
                curl.perform()
        except:
                error('Connection error!')
                return False

        list_name = re.findall("class=\"results\"&gt; &lt;h2&gt;(<^&lt;>*)&lt;/h2&gt;", data.getvalue())<0><20:-2>
        musics = re.findall("file_id=\"(<^\">*)\" track_id=\"(<^\">*)\" singer=\"(<^\">*)\" song=\"(<^\">*)\" link", data.getvalue())

        z = len(list_name.decode('utf-8'))

        if m in <0, 2>:
                m3u = open('playlist <'+list_name+'>.m3u', 'w')
                for music in musics:
                        m3u.write('#EXTINF: 0, '+music<2>+' - '+music<3>+'\nhttp://prostopleer.com/download/'+music<0>+'\n')
                m3u.close()
                print ' ?????????????????????????????????????????????????????'+'?'*z+'?'
                print ' ? Playlist from playlist ('+list_name+') was successfully created ?'
                print ' ?????????????????????????????????????????????????????'+'?'*z+'?'

        if m in <1, 2>:
                print ' ?????????????????????????????????????????????????????'+'?'*z+'?'
                print '??     Start download songs from your playlist ('+list_name+')     ?'
                print '??????????????????????????????????????????????????????'+'?'*z+'?'
                for music in musics:
                        download_mp3('playlist <'+list_name+'>', music<2>+' - '+music<3>, music<0>)
                print '??????????????????????????????????????????????????????'+'?'*z+'?'
                print '?? Songs from playlist ('+list_name+') was successfully downloaded ?'
                print ' ?????????????????????????????????????????????????????'+'?'*z+'?'

# Create .m3u playlist and/or download songs from radio.
# Example: "radio('top/msk/nasheradio', 2)".
def radio(r, f):
        data.truncate(0)
        curl.setopt(pycurl.URL,'http://prostopleer.com/'+r)
        curl.setopt(curl.NOPROGRESS, 1)
        try:
                curl.perform()
        except:
                error('Connection error!')
                return False

        radio_name = re.findall("radio-name\"&gt;(<^&lt;>*)&lt;/span&gt;", data.getvalue())<0>
        musics = re.findall("file_id=\"(<^\">*)\" singer=\"(<^\">*)\" song=\"(<^\">*)\" link", data.getvalue())

        z = len(radio_name.decode('utf-8'))

        if f in <0, 2>:
                m3u = open('radio <'+radio_name+'>.m3u', 'w')
                for music in musics:
                        m3u.write('#EXTINF: 0, '+music<1>+' - '+music<2>+'\nhttp://prostopleer.com/download/'+music<0>+'\n')
                m3u.close()
                print ' ?????????????????????????????????????????????????????'+'?'*z+'?'
                print ' ?  Playlist from radio ('+radio_name+') was successfully created   ?'
                print ' ?????????????????????????????????????????????????????'+'?'*z+'?'

        if f in <1, 2>:
                print ' ?????????????????????????????????????????????????????'+'?'*z+'?'
                print '??         Start download songs from radio ('+radio_name+')         ?'
                print '??????????????????????????????????????????????????????'+'?'*z+'?'
                for music in musics:
                        download_mp3('radio <'+radio_name+'>', music<1>+' - '+music<2>, music<0>)
                print '??????????????????????????????????????????????????????'+'?'*z+'?'
                print '??  Songs from radio ('+radio_name+') was successfully downloaded   ?'
                print ' ?????????????????????????????????????????????????????'+'?'*z+'?'

if options.mode in <'0', '1', '2'>:
        if options.url != None:
                u = re.findall('(list.*)', options.url)
                if u:
                        playlist(u<0>, int(options.mode))
                else:
                        u = re.findall('(top/.*)', options.url)
                        if u:
                                radio(u<0>, int(options.mode))
                        else:
                                error('Error URL!')
        else:
                error('Enter URL!')
else:
        error('Error MODE!')

curl.close()
</you></connection>

Зависимости: python, python-pycurl, python-progressbar.
$ sudo apt-get install python python-pycurl python-progressbar

PS: буду рад предложениям и замечаниям ;)
PPS: нет, 60 рублей в месяц совсем не много, но скрипт я все-же написал =)
Полностью.
+ 2 -
1
Q2W 26.03.2011 15:01

СкриптыПереключение с/на внешний монитор

У меня в офисе большой мнитор, но работаю я на ноутбуке. Поэтому подключаю его к ноуту.
Так вот почему-то не нашёл я функционала, который автоматически переключал бы изображение с одного монитора на другой.
Собственно поэтому был написан Perl-скрипт:

 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
#!/usr/bin/perl

# Переключатель мониторов. При подключении или отключении внешнего монитора нужно вызвать этот скрипт (например, повесить его на
# горячую клавишу или на событие в системе, если такое найдётся) и он переключит изображение либо на внешний монитор, если тот
# подключен, либо на дефолтный, если внешний не подключен.

use strict;
use warnings;

my $defaultMonitorOutput = 'LVDS1';	# Здесь указываем название выхода, к которому подключён дефолтный монитор.
my $externalMonitorOutput = 'VGA1';	# А здесь тот внешний выход, к котором подключаем второй монитор.
					# Имена выходов можно посмотреть в выводе команды "xrandr".

my $xrandr = `xrandr`;	# Вызываем xrandr, дабы узнать, какие мониторы подключены, и какие из них заюзаны

my %connected;		# Те, что подключены, отмечаются xrandr'ом словом "connected"
$connected{$1} = 1 while $xrandr =~ m/^(<^ >+) connected/ogm;

my %used;		# А те, что заюзаны, имеют какое-то разрешение экрана - циферку после "connected"
$used{$1} = 1 while $xrandr =~ m/^(<^ >+) connected \d/ogm;

print "\tПодключённые мониторы:\t".join(', ', keys %connected).".\n\tЗаюзанные мониторы:\t".join(', ', keys %used).".\n";

# Если на внешнем выходе что-то подключили, а заюзан всё ещё тот, что на дефолтном выходе, переключим их.
if($connected{$externalMonitorOutput} and $used{$defaultMonitorOutput})
{
	print "\Заюзаем подключённый $externalMonitorOutput и убираем $defaultMonitorOutput.\n";
	`xrandr --output $externalMonitorOutput --auto`;	# Включаем монитор на внешнем выходе с оптимальный разрешением
	`xrandr --output $defaultMonitorOutput --off`;		# Выключаем монитор на дефолтном выходе
}
# А если на внешнем выходе уже ничего не подключено, а тот, что на дефолтном выходе, ещё не заюзан, переключим обратно.
elsif(!$connected{$externalMonitorOutput} and !$used{$defaultMonitorOutput})
{
	print "\tУбираем отключённый $externalMonitorOutput и заюзаем $defaultMonitorOutput.\n";
	`xrandr --output $defaultMonitorOutput --auto`;		# Включаем монитор на дефолтном выходе с оптимальным разрешением
	`xrandr --output $externalMonitorOutput --off`;		# Выключаем монитор на внешнем выходе
} else {
	print "\tВсё уже ОК, действия не нужны.\n";
}

Перед использованием подставьте свои названия видеовыходов в переменные $defaultMonitorOutput и $externalMonitorOutput в начале скрипта.

Сначала хотел, чтобы он сам обнаруживал подключение внешнего монитора, но узнать об этом событии я смог только периодическим парсингом вывода xrandr, из-за которого всё тормозит пару секунд, хоть и не видно нагрузки.
Так что если кто-то подскажет нормальный способ словить это событие не мешая, будет супер.
Полностью.
+ 5 -
1
rufus 25.03.2011 18:40

Скриптыtorrent tracker в домашних условиях

На хабре есть пост на эту тему "Переводим раздачу контента на BitTorrent", но там не учтено, что сервер может быть без выделенного ip и веб-сервера.
Полностью.
+ 4 -
41
x0x01 25.03.2011 16:59

СкриптыКачаем обновленные торренты c rutracker.org

Как известно, многие раздачи ведутся путем добавления новых файлов к уже существующим, у rutracker.org нет прямого RSS на обновленный torrent файл.
Данный скрипт исправляет этот недостаток. Обходя ссылки из файла urls.lst, проверяет изменились ли размеры torrent файлов, в случае изменений - сохраняет обновленный и запоминает размер в last.lst

Не забудьте перед запуском создать urls.lst и пустой last.lst в каталоге со скриптом.

Собственно код:

#!/usr/bin/env python2
# -*- coding: UTF-8 -*-
# created by x0x01 (aka.x0x01[AT]gmail[dot]com)

import urllib, urllib2, cookielib
from string import strip

LOGIN = 'username'
PASS = 'password'
# путь для сохранения torrent файла
OUT_DIR = './'
#OUT_DIR = '/tmp/gettor/'

# формирование кук
post_params = urllib.urlencode({
'login_username' : LOGIN,
'login_password' : PASS,
'login' : '%C2%F5%EE%E4'
})

# инит обработчика кук
cookie = cookielib.CookieJar()
opener = urllib2.build_opener(urllib2.HTTPCookieProcessor(cookie))
urllib2.install_opener(opener)

# авторизация + сессия с куками
web_obj = opener.open('http://login.rutracker.org/forum/login.php', post_params)
data = web_obj.read()

try:
# читаем файл со ссылками, формируем список
fl_url_list = open('urls.lst', 'r')
url_arr = fl_url_list.readlines()
fl_url_list.close()
# чтение файла "размеров", формируем список
fl_dta_list = open('last.lst', 'r')
dta_arr = fl_dta_list.readlines()
fl_dta_list.close()
except IOError:
print 'err'
dta_arr = []


# открытие на запись для новых "размеров" в last.lst
fl_dta_list = open('last.lst', 'w')

# из списка "размеров" формируем словарь ID:SIZE
dta_dic = {}
for curr in dta_arr:
# отрезаем переносы строк
curr = strip(curr)
# делим строку по пробелу и создаем словарь
dta_dic[str.split(curr)[0]] = str.split(curr)[1]

# сохранение torrent файла
def dw_torrent_f(b_data, f_name):
f = open(OUT_DIR+f_name+'.torrent', 'w')
f.write(b_data)
f.close()

# обработка ссылок
for thread_url in url_arr:
# отрезаем переносы строк
thread_url = strip(thread_url)
# делим ссылку на 2 части (получение id форума)
topic_id = str.split(thread_url,'=')[1]
dl_torrent_url = 'http://dl.rutracker.org/forum/dl.php?t='+topic_id
# получение torrent файла по ссылке
web_obj = opener.open(dl_torrent_url, post_params)
data = web_obj.read()
# сравнение размеров полученного файла и в last.lst
try:
if len(data) <> int(dta_dic[topic_id]):
# этот обновился, сохраняем
print '[^]', thread_url
dw_torrent_f(data, topic_id)
except (IndexError, KeyError):
# этот новый, сохраняем
print '[+]', thread_url
dw_torrent_f(data, topic_id)
#print 'UPD:', dl_torrent_url, 'new:', len(data), 'old:', m_dic[topic_id]
# пишем в last.lst новые значения id и размер
fl_dta_list.write(str(topic_id)+' '+str(len(data))+'\n')

# закрытие файла
fl_dta_list.close()


кусочек моего urls.lst

http://rutracker.org/forum/viewtopic.php?t=3414220
http://rutracker.org/forum/viewtopic.php?t=3216842
http://rutracker.org/forum/viewtopic.php?t=3157454

Полностью.
+ 0 -
16
uscr 25.03.2011 10:55

СкриптыАвтоматически поднимаем ad-hoc точку доступа в линукс.

Что происходит?


Здравствуйте. Последнее время участились вопросы о поднятии ad-hoc точки доступа на компьютере с линуксом на борту. В связи с этим я наваял небольшой скриптик, который думает за вас.

Как это работает


Скрипт самостоятельно определяет имя и адрес устройства, через которое вы общаетесь с интернетом (делает он это исходя из шлюза по умолчанию). Затем легко и просто поднимает точку доступа, NAT и DHCP сервер.

Раньше все свои посты я старался писать так, что бы даже самый непросвящённый линуксюзер смог путём простой копипасты получить работающее решение. В это раз я напишу целых 3 инструкции по развёртыванию скрипта - для закалённых в бою линуксадминов, для средней осведомлённости пользователей и для виндузятников, которые сегодня впервые увидели линукс. Таким, образом, просто выберите нужную вам инструкцию и не тратьте своё время зря.
Полностью.
+ 6 -
8
alxrt 24.03.2011 11:01

СкриптыПолучение прямых ссылок на видео вконтакте

Что-то никак не получается прекратить писать скрипты.
На этот раз выкладываю порождение дзен-магии, тормознутого фаербага и безумной вакханалии regexp-ов.
Этот скрипт умеет получать прямые ссылки на видеофайлы на основе переданного ему url-а.
Полностью.
+ 6 -
13
alxrt 23.03.2011 10:38

СкриптыПолучение торрентов с rutracker.org

Еще один скриптик для получения данных.
На данный момент реализовано только получение torrent-файлов по идентификатору топика, но в планах есть и получение описания, и выполнение запросов на поиск с сортировкой и выборкой данных.

UPD: Поправил пару косяков, связанных с разными доменными именами у разных трекеров.
Полностью.
+ 7 -
18
Clq 17.03.2011 17:16

СкриптыАвтоматическое управление скоростью Transmission

Автоматическая установка и снятие ограничения скорости для Transmission в зависимости от наличия/отсутствия активности пользователя.
Торренты часто забивают весь канал, и пользоваться браузером при этом невозможно. Решение: установить для торрент-клиента ограничитель скорости в 60-70% от ширины канала. Но, когда я отхожу от компа на более-менее длительное время, хочется, чтобы торренты шпарили на полную. Для того, чтобы не переключать этот «черепаший» режим каждый раз вручную, и был написан этот скрипт. Основной компонент: xprintidle — просто выводит время бездействия юзера за компьютере.

Зависимости: xprintidle, libnotify-bin, transmission-cli

Предварительно также нужно в графическом клиенте настроить параметры ограничения скорости и включить веб-интерфейс.
Полностью.
+ 13 -
17
segoon 17.03.2011 14:16

СкриптыОтслеживание пакетов на distrowatch

Есть такой ресурс, http://distrowatch.com/. У него есть страничка с отслеживанием некоторых популярных пакетов, http://distrowatch.com/packages.php. У этой странички есть rss, но почему-то в нём видны только 11 последних обновлений пакетов. Мне нужно иметь более длинный список, поэтому я написал группу скриптов, которые регулярно грабят rss и сохраняют в локальный файл.

~/bin/distrowatch-packages-update:
Полностью.
+ 2 -
8
segoon 17.03.2011 13:24

СкриптыПросмотр MSDN через less

Мини-скрипт, который качает с сайта msdn.microsoft.com документацию по конкретной функции и показывает через less. На его примере видно, как можно использовать xargs/grep/awk для обработки произвольной информации, хотя может быть скрипт пригодится кому-то в чистом виде.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#!/bin/bash

wget -q -U 'Firefox' -O - "www.google.com/search?q=msdn+$1" |\
         xargs -d'"' -L1 |\
         grep msdn\.microsoft  | \
         head -n 1 | xargs wget -q -O - | \
         awk '
 /h1/ { if (H != 1) print "&lt;html&gt; &lt;meta charset=\"UTF-8\"&gt;"; H=1 }
 /Send comments about this topic to Microsoft/ { exit; }
      { if (H==1) print;} ' | \
         lynx -dump -stdin | \
         less
Полностью.
+ 4 -
3
1 2 3 4 5 6 7 8 11 12