Mar 31

Kickass Torrents 还没有被取缔的时候,我下载磁力链接的软件是μTorrent,当时 Kickass Torrents 提供订阅功能,然后我在 μTorrent 上添加订阅链接,每天就会自动将我的感兴趣图书源源不断地下载到本地。后来 Kickass Torrents 到了,μTorrent只能在PC机上运行,不能在我的 Raspbery Pi 上运行,而 PC 机的耗电量太大了,所以我改用能在 Raspbery Pi 上运行的 Transmission 下载。Transmission 既可以下载种子,又可以下载磁力链接,但是没有订阅功能,只能一条一条的手动添加磁力链接,所以每当我要下载几十本书的时候就很郁闷。

现在通过 Google,我找到了一个间接的方法,通过 Linux 的 Shell 命令,用 Aria2c 批量将磁力链接转换为种子,再设置 Transmission 自动导入种子。而磁力链接的获取则可以通过爬虫的方式获得,这样就圆满地解决了我的问题。

1.设置 Transmission

mkdir Transmission-Torrents
sudo service transmission-daemon stop
sudo vim /etc/transmission-daemon/settings.json

在 Transmission 设置文件 settings.json 最后面增加/修改以下三项:

"watch-dir": "/home/pi/Transmission-Torrents",
"watch-dir-enabled": true,
"trash-original-torrent-files": true,

保存,启动 Transmission

sudo service transmission-daemon start

2.下载 magnet2torrent
地址:https://github.com/weirdcrap/magnet2torrent

git clone https://github.com/weirdcrap/magnet2torrent
cd magnet2torren
vim magnet2torren

设置 ~/movie-watch 为自己的目录,而我就设置为本目录,即 /home/pi/magnet2torrent
注释掉第33、41行,这样就不会每次自动删除磁力链接文件和生成的种子,我喜欢手动删除它们。修改第39行,系统里面 Aria2c 的地址,我的 Aria2c 是编译安装的,所以地址是 /usr/bin/aria2c。最后还需要提醒一下, Aria2c 必须具有能下载 BT 的功能,如果是自己编译安装的话记得将 BT 的功能加上。

3.开始批量添加磁力链接
启动 Aria2c

sudo aria2c --conf-path=/home/pi/.aria2/aria2.conf -D

添加磁力链接

vim /home/pi/magnet2torrent/1.magnet

在 1.magnet 试着添加几条磁力链接的种子,保存退出。然后运行 magnet2torren 生成种子。

sudo ./magnet2torrent

最后将批量生成的种子复制到 Transmission-Torrents 就行了。Transmission 自动将 种子添加到下载列表的速度非常快。

Mar 20

快捷键 说明
Cmd + N 新建文件
Cmd + O 打开文件
Cmd + W 关闭文件
Cmd + Shift + T 打开最近关闭文件
Cmd + S 保存
Cmd + Shift + S 另存为
Cmd + Alt + S 全保存
Shift + Cmd + N 打开新窗口
Shift + Cmd + W 关闭窗口
NA 恢复到上一次保存时状态
Cmd + Z 撤销
Cmd + Y 或者 Cmd + Shift + Z 反撤销
Cmd + U 软撤销
Shift + Cmd + U 反软撤销
Cmd + Shift + V 保持缩进粘贴
Alt + Cmd + V 从剪切板中粘贴
Cmd + ] 缩进
Cmd + [ 取消缩进
Control + Cmd + ↑ 行上移
Control + Cmd + ↓ 行下移
Shift + Cmd + D 行复制
Shift + Control + K 行删除
Cmd + J 合并下一行
Cmd + / 行注释
Alt + Cmd + / 块注释
Shift + Cmd + Enter 行前插入一行
Cmd + Enter 行后插入一行
Cmd + Delete 删除本行光标前面的内容
Control + D 向后删除
Control + K 删除本行光标后面的内容
Control + T 和后一个字符调换
Alt + Cmd + . 补全标签
Cmd + Shift + W 用 p 标签包裹文字
Shift + Cmd + A 逐层选中父级标签包含的内容
Cmd + K , Cmd + Space 设置标记
Cmd + K , Cmd + A 选择当前光标到标记处的内容
Cmd + K , Cmd + W 删除当前光标到标记处的内容
Cmd + K , Cmd + G 清除标记
Cmd + Y 在光标当前位置粘贴最近一次剪切的内容
Alt + Cmd + ] 逐层折叠代码
Alt + Cmd + [ 展开代码
Cmd + K , Cmd + Y 展开所有代码
Cmd + K , Cmd + 1 一级折叠代码
Cmd + K , Cmd + num {num}级折叠代码
Cmd + K , Cmd + T 折叠标签属性
Cmd + K , Cmd + U 大写转换
Cmd + K , Cmd + L 小写转化
Alt + Cmd + Q 指定一行长度,然后将文本重新排序
Cmd + Space 显示补全
F5 对选中(或所有)行进行排序
Cmd + F5 对选中(或所有)行进行排序,区分大小写
Alt + Cmd + T 特殊字符选择
NA 选中(或所有)行的打乱、反转、去重 多重选择的排序、排序(区分大小写)、反转、去重和打乱
Cmd + Shift + L 将选中的块变成为多个光标选中每一行
Control + Shift + ↑ 选中上一行同一位置(冲突!改为 Alt + ↑)
Control + Shift + ↓ 选中下一行同一位置(冲突!改为 Alt + ↓)
ESC 恢复当个光标
Cmd + A 全选
Cmd + L 选中光标所在行
Cmd + D 选中光标所在单词
Cmd + Shift + Space 逐层向上选择块内容
Shift + Control + M 逐层向上选中括号内的内容
Cmd + Shift + J 逐层向上选中相同缩进的内容
Cmd + Shift + A 逐层向上选中便签内容
NA 反向选择 选中整段
Cmd + F 查找
Cmd + G 查找下一个
Cmd + Shift + G 查找上一个
Cmd + I 增量查找
Alt + Cmd + F 替换
Alt + Cmd + E 替换下一个
Alt + Cmd + G 快速查找
Control + Cmd + G 快速查找并选中全部
Cmd + D 同时选中下一个匹配项
Cmd + E 将选中的内容用于查找
Shift + Cmd + E 将选中的内容用于替换
Shift + Cmd + F 在文件夹中查找
F4 (文件夹查找)查找下一个
Shift + F4 (文件夹查找)查找上一个
Cmd + K , Cmd + B 显示(隐藏)侧边栏
Control + ` 打开控制台
Cmd + Control + F 全屏模式
Cmd + Shift + Control + F 无扰模式
Alt + Cmd + 1 单一布局
Alt + Cmd + 2 两列布局
Alt + Cmd + 3 三列布局
Alt + Cmd + 4 四列布局
Alt + Shift + Cmd + 2 两行布局
Alt + Shift + Cmd + 3 三行布局
Alt + Cmd + 5 田形布局
Cmd + K , Cmd + ↑ 移动文件到新的一组
Cmd + K , Cmd + Shift + ↑ 新建一组视图
Cmd + K , Cmd + ↓ 关闭一组视图
Cmd + K , Cmd + → 光标移动到下一组视图
Cmd + K , Cmd + ← 光标移动到上一组视图
Cmd + K , Cmd + Shift + → 文件移动到下一组视图
Cmd + K , Cmd + Shift + ← 文件移动到上一组视图
F6 拼写检查
Cmd + P 文件跳转
Cmd + R 函数(符号)跳转
Cmd + Shift + R 在工程文件夹中函数(符号)跳转
Alt + Cmd + ↓ 跳转到文件中定义改函数的地方
Control + G 行跳转
Control + - 光标位置后退
Control + Shift + - 光标位置前进
Alt + Cmd + → 下一个文件
Alt + Cmd + ← 上一个文件
Control + Tab (按访问顺序)上一个文件
Control + Shift + Tab (按访问顺序)下一个文件
Alt + Cmd + ↑ switch header/implementation
Control + L 滚动到光标所在位置
Control + Alt + ↑ 向下滚动
Control + Alt + ↓ 向下滚动一行
Cmd + F2 添加或者删除标签
F2 移动下一个标签
Shift + F2 移动到上一个标签
Shift + Cmd + F2 清除所有标签
Control + M 在匹配的括号之间跳转
NA 选中所有标签
Cmd + Shift + P 命令窗口
Cmd + B 编译
Cmd + C 取消编译
Control + Q 开始(结束)录制宏
Control + Shift + Q 执行宏
Cmd + Control + P 项目之间切换

Jan 20

1.下载 DD-WRT固件文件
buffalo-to-dd-wrt_webflash-MULTI.bin
http://dd-wrt.com/routerdb/de/download/Buffalo/WHR-G300N/v2/buffalo-to-dd-wrt_webflash-MULTI.bin

whr-g300nv2-firmware-MULTI.bin
http://dd-wrt.com/routerdb/de/download/Buffalo/WHR-G300N/v2/whr-g300nv2-firmware-MULTI.bin

2.刷入 buffalo-to-dd-wrt_webflash-MULTI.bin 固件
路由器通电,任意LAN口接PC。打开浏览器输入http://192.168.11.1,用户名root,密码为空。进入路由器管理界面。
点击“更新Air Station固件”,开始第一遍刷固件。用buffalo-to-dd-wrt_webflash-MULTI.bin。等待进度条结束,按住路由器Reset 15秒,然后用浏览器访问http://192.168.1.1(注意:这时地址已经变化了)。然后设置管理员用户名与密码。

3.刷入 whr-g300nv2-firmware-MULTI.bin 固件
选择“Administration” -> “Firmware Upgrade”, 这次用whr-g300nv2-firmware-MULTI.bin刷。等待刷新结束,再次Rest。再用浏览器访问http://192.168.1.1并设置管理员用户名与密码。

以上两步一定要保证路由器刷新过程中不可断电,也不要关闭浏览器!

参考资料:
1.http://www.tuicool.com/articles/6Fr6ru
2.http://blog.csdn.net/heiheihoho/article/details/8041956

Dec 21

1.Aria2 源码下载
http://sourceforge.net/projects/aria2/files/stable/

2.安装必须的库文件

sudo apt-get install gcc c++ autoconf automake libcppunit-dev  autopoint openssl libtool sphinx-common sphinxsearch libgcrypt11-dev libxml2-dev pkg-config

3.编译安装

tar zxvf aria2-1.17.tar.gz  
cd aria2-1.17.1  
./configure ARIA2_STATIC=yes --enable-bittorrent --enable-metalink

如果编译不能通过,可以删掉 ARIA2_STATIC=yes 选项:

./configure --enable-bittorrent --enable-metalink
make
sudo make install

4.添加启动脚本
/etc/init.d/aria2

#!/bin/sh  
  
### BEGIN INIT INFO  
# Provides:          aria2  
# Required-Start:  
# Required-Stop:  
# Default-Start:  
# Default-Stop:  
# Short-Description: aria2  
### END INIT INFO  
  
case $1 in  
        start)  
                touch /etc/aria2/session.txt  
                /usr/bin/aria2c --conf-path=/etc/aria2/aria2.conf -D  
                ;;  
        stop)  
                killall aria2c  
                ;;  
        *)  
                echo "Usage: /etc/init.d/aria2 {start|stop}"  
                exit 1  
                ;;  
esac  
exit 0

5.增加启动项

sudo update-rc.d aria2 defaults

6.添加 Aria2 配置文件

enable-rpc=true  
rpc-allow-origin-all=true  
rpc-listen-all=true  
rpc-listen-port=6800  
#event-poll=select  
disable-ipv6=true  
  
max-concurrent-downloads=2  
continue=true  
max-connection-per-server=5  
min-split-size=10M  
split=5  
max-overall-download-limit=0  
max-download-limit=0  
max-overall-upload-limit=15k  
max-upload-limit=15k  
#lowest-speed-limit=0  
#referer=*  
input-file=/etc/aria2/session.txt  
save-session=/etc/aria2/session.txt  
save-session-interval=30  
dir=/nas/aria2  
disk-cache=16M  
enable-mmap=true  
  
file-allocation=none  
force-save=true   
  
follow-torrent=true  
bt-hash-check-seed=true  
bt-seed-unverified=true  
bt-save-metadata=true  
#bt-request-peer-speed-limit=2M  
bt-save-metadata=true  
#seed-time=10  
seed-ratio=0.1  
   
log=/etc/aria2/aria2.log  
log-level=error  
max-download-result=50  
Dec 21

1.下载源代码
目前 MiniDLNA 最新版本 1.1.5, 下载地址:
https://sourceforge.net/projects/minidlna/files/minidlna/

2.修改源文件
metadata.c

//line 840  
else if( strncmp(ctx->iformatctx->name, "matroska", 8) == 0 )  
    xasprintf(&m.mime, "video/x-matroska");  
else if( strcmp(ctx->iformatctx->name, "flv") == 0 )  
    xasprintf(&m.mime, "video/x-flv");  
//----add----  
else if( strcmp(ctx->iformat->name, "rm") == 0 )  
    xasprintf(&m.mime, "video/x-pn-realvideo");  
else if( strcmp(ctx->iformat->name, "rmvb") == 0 )  
    xasprintf(&m.mime, "video/x-pn-realvideo");  
//---end----  
if( m.mime )  
    goto video_nodlna;  

upnpglobalvars.h

// Line 169  
    "http-get:*:audio/mp4:*," \  
    "http-get:*:audio/x-wav:*," \  
    "http-get:*:audio/x-flac:*," \  
    "http-get:*:application/ogg:*," \  
//----add----  
    "http-get:*:video/x-pn-realvideo:*"  
//----end----  
  
#define DLNA_FLAG_DLNA_V1_5      0x00100000
#define DLNA_FLAG_HTTP_STALLING  0x00200000

utils.c

//line 381  
        ends_with(file, ".m2t") || ends_with(file, ".mkv")   ||  
        ends_with(file, ".vob") || ends_with(file, ".ts")    ||  
        ends_with(file, ".flv") || ends_with(file, ".xvid")  ||  
//----add----  
        ends_with(file, ".rm")  || ends_with(file, ".rmvb")  ||  
//----end----  
#ifdef TIVO_SUPPORT  
        ends_with(file, ".TiVo") ||  
#endif  
        ends_with(file, ".mov") || ends_with(file, ".3gp"));

3.编译安装

sudo apt-get install build-essential libexif-dev libjpeg-dev \  
libid3tag0-dev libFLAC-dev libvorbis-dev libsqlite3-dev libavformat-dev \  
autoconf automake  
  
./autogen.sh  
./configure  
make  
make install  
sudo cp ./linux/minidlna.inot.d.script.tmpl  /etc/init.d/minidlna  
sudo cp ./minidlna.conf  /etc/minidlna.conf  
  
# 第一次启动使用-d –v选项看有没有出错  
sudo /usr/local/sbin/minidlnad -d -v  
# 没出错就ctrl+c 结束进程  
  
# 正常启动  
sudo service minidlna start  
# 刷新列表  
sudo service minidlna restart  

4.MiniDLNA 配置

# port for HTTP (descriptions, SOAP, media transfer) traffic  
port=8200  
  
# network interfaces to serve, comma delimited  
#network_interface=eth0  
  
# specify the user account name or uid to run as  
#user=jmaggard  
  
# set this to the directory you want scanned.  
# * if you want multiple directories, you can have multiple media_dir= lines  
# * if you want to restrict a media_dir to specific content types, you  
#   can prepend the types, followed by a comma, to the directory:  
#   + "A" for audio  (eg. media_dir=A,/home/jmaggard/Music)  
#   + "V" for video  (eg. media_dir=V,/home/jmaggard/Videos)  
#   + "P" for images (eg. media_dir=P,/home/jmaggard/Pictures)  
#   + "PV" for pictures and video (eg. media_dir=PV,/home/jmaggard/digital_camera)  
media_dir=/opt  
  
# set this to merge all media_dir base contents into the root container  
# note: the default is no  
#merge_media_dirs=no  
  
# set this if you want to customize the name that shows up on your clients  
#friendly_name=My DLNA Server  
  
# set this if you would like to specify the directory where you want MiniDLNA to store its database and album art cache  
#db_dir=/var/cache/minidlna  
  
# set this if you would like to specify the directory where you want MiniDLNA to store its log file  
#log_dir=/var/log  
  
# set this to change the verbosity of the information that is logged  
# each section can use a different level: off, fatal, error, warn, info, or debug  
#log_level=general,artwork,database,inotify,scanner,metadata,http,ssdp,tivo=warn  
  
# this should be a list of file names to check for when searching for album art  
# note: names should be delimited with a forward slash ("/")  
album_art_names=Cover.jpg/cover.jpg/AlbumArtSmall.jpg/albumartsmall.jpg/AlbumArt.jpg/albumart.jpg/Album.jpg/album.jpg/Folder.jpg/folder.jpg/Thumb.jpg/thumb.jpg  
  
# set this to no to disable inotify monitoring to automatically discover new files  
# note: the default is yes  
inotify=yes  
  
# set this to yes to enable support for streaming .jpg and .mp3 files to a TiVo supporting HMO  
enable_tivo=no  
  
# set this to strictly adhere to DLNA standards.  
# * This will allow server-side downscaling of very large JPEG images,  
#   which may hurt JPEG serving performance on (at least) Sony DLNA products.  
strict_dlna=no  
  
# default presentation url is http address on port 80  
#presentation_url=http://www.mylan/index.php  
  
# notify interval in seconds. default is 895 seconds.  
notify_interval=900  
  
# serial and model number the daemon will report to clients  
# in its XML description  
serial=12345678  
model_number=1  
  
# specify the path to the MiniSSDPd socket  
#minissdpdsocket=/var/run/minissdpd.sock  
  
# use different container as root of the tree  
# possible values:  
#   + "." - use standard container (this is the default)  
#   + "B" - "Browse Directory"  
#   + "M" - "Music"  
#   + "V" - "Video"  
#   + "P" - "Pictures"  
#   + Or, you can specify the ObjectID of your desired root container (eg. 1$F for Music/Playlists)  
# if you specify "B" and client device is audio-only then "Music/Folders" will be used as root  
#root_container=.  
  
# always force SortCriteria to this value, regardless of the SortCriteria passed by the client  
#force_sort_criteria=+upnp:class,+upnp:originalTrackNumber,+dc:title  
  
# maximum number of simultaneous connections  
# note: many clients open several simultaneous connections while streaming  
#max_connections=50  

转自:http://blog.csdn.net/haven200/article/details/43039261#