]> git.phdru.name Git - dotfiles.git/blob - bin/recode_filenames.py
b8d3fa04daca8794a10479951126cb9e3a7932ac
[dotfiles.git] / bin / recode_filenames.py
1 #! /usr/bin/env python3
2 # -*- coding: koi8-r -*-
3
4 import sys
5
6 src_encoding = sys.argv[1]
7 dst_encoding = sys.argv[2]
8
9 if src_encoding == "translit":
10     if dst_encoding == "koi8-r":
11         from m_lib.rus.lat2rus import lat2koi as _recode
12     elif dst_encoding == "cp1251":
13         from m_lib.rus.lat2rus import lat2win as _recode
14     else:
15         raise NotImplementedError("destination encoding must be koi8-r or cp1251, not `%s'" % dst_encoding)
16
17 elif dst_encoding == "translit":
18     if src_encoding == "koi8-r":
19         from m_lib.rus.rus2lat import koi2lat as _recode
20     elif src_encoding == "cp1251":
21         from m_lib.rus.rus2lat import win2lat as _recode
22     else:
23         raise NotImplementedError("source encoding must be koi8-r or cp1251, not `%s'" % src_encoding)
24
25     from m_lib.rus.rus2lat import koi2lat_d
26     koi2lat_d["Ъ"] = '' # remove apostrophs -
27     koi2lat_d["Ь"] = '' # they are not very good characters in filenames
28     koi2lat_d["ъ"] = '' # especially on Windoze
29     koi2lat_d["ь"] = '' # :-)
30
31 elif src_encoding == "url":
32     try:
33         src_encoding, dst_encoding = dst_encoding.split('/')
34     except ValueError:
35         src_encoding = dst_encoding
36     from m_lib.opstring import recode
37     import urllib
38     def _recode(s):
39         s = urllib.unquote(s)
40         if src_encoding != dst_encoding:
41             s = recode(s, src_encoding, dst_encoding, "replace")
42         return s
43
44 elif dst_encoding == "url":
45     try:
46         src_encoding, dst_encoding = src_encoding.split('/')
47     except ValueError:
48         dst_encoding = src_encoding
49     from m_lib.opstring import recode
50     import urllib
51     def _recode(s):
52         if src_encoding != dst_encoding:
53             s = recode(s, src_encoding, dst_encoding, "replace")
54         return urllib.quote(s, safe=";/?:@&=+$,()'") # wget treats them as safe
55
56 else:
57     from m_lib.opstring import recode
58     def _recode(s):
59         return recode(s, src_encoding, dst_encoding, "replace")
60
61
62 if __name__ == "__main__":
63     import os
64     for filename in sys.argv[3:]:
65         new_name = _recode(filename)
66         if type(filename) is not type(new_name):
67             new_name = new_name.decode()
68         if new_name != filename:
69             os.rename(filename, new_name)