forked from pyload/pyload
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathutils.py
More file actions
201 lines (155 loc) · 4.71 KB
/
utils.py
File metadata and controls
201 lines (155 loc) · 4.71 KB
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
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
# -*- coding: utf-8 -*-
""" Store all usefull functions here """
import os
import sys
import time
import re
from os.path import join
from string import maketrans
from htmlentitydefs import name2codepoint
def chmod(*args):
try:
os.chmod(*args)
except:
pass
def decode(string):
""" decode string with utf if possible """
try:
return string.decode("utf8", "replace")
except:
return string
def remove_chars(string, repl):
""" removes all chars in repl from string"""
if type(string) == str:
return string.translate(maketrans("", ""), repl)
elif type(string) == unicode:
return string.translate(dict([(ord(s), None) for s in repl]))
def save_path(name):
#remove some chars
if os.name == 'nt':
return remove_chars(name, '/\\?%*:|"<>')
else:
return remove_chars(name, '/\\"')
def save_join(*args):
""" joins a path, encoding aware """
return fs_encode(join(*[x if type(x) == unicode else decode(x) for x in args]))
# File System Encoding functions:
# Use fs_encode before accesing files on disk, it will encode the string properly
if sys.getfilesystemencoding().startswith('ANSI'):
def fs_encode(string):
try:
string = string.encode('utf-8')
finally:
return string
fs_decode = decode #decode utf8
else:
fs_encode = fs_decode = lambda x: x # do nothing
def get_console_encoding(enc):
if os.name == "nt":
if enc == "cp65001": # aka UTF-8
print "WARNING: Windows codepage 65001 is not supported."
enc = "cp850"
else:
enc = "utf8"
return enc
def compare_time(start, end):
start = map(int, start)
end = map(int, end)
if start == end: return True
now = list(time.localtime()[3:5])
if start < now < end: return True
elif start > end and (now > start or now < end): return True
elif start < now > end < start: return True
else: return False
def formatSize(size):
"""formats size of bytes"""
size = int(size)
steps = 0
sizes = ["B", "KiB", "MiB", "GiB", "TiB"]
while size > 1000:
size /= 1024.0
steps += 1
return "%.2f %s" % (size, sizes[steps])
def formatSpeed(speed):
return formatSize(speed) + "/s"
def freeSpace(folder):
if os.name == "nt":
import ctypes
free_bytes = ctypes.c_ulonglong(0)
ctypes.windll.kernel32.GetDiskFreeSpaceExW(ctypes.c_wchar_p(folder), None, None, ctypes.pointer(free_bytes))
return free_bytes.value
else:
from os import statvfs
s = statvfs(folder)
return s.f_bsize * s.f_bavail
def uniqify(seq, idfun=None):
# order preserving
if idfun is None:
def idfun(x): return x
seen = {}
result = []
for item in seq:
marker = idfun(item)
# in old Python versions:
# if seen.has_key(marker)
# but in new ones:
if marker in seen: continue
seen[marker] = 1
result.append(item)
return result
def parseFileSize(string, unit=None): #returns bytes
if not unit:
m = re.match(r"(\d*[\.,]?\d+)(.*)", string.strip().lower())
if m:
traffic = float(m.group(1).replace(",", "."))
unit = m.group(2)
else:
return 0
else:
if isinstance(string, basestring):
traffic = float(string.replace(",", "."))
else:
traffic = string
#ignore case
unit = unit.lower().strip()
if unit in ("gb", "gig", "gbyte", "gigabyte", "gib", "g"):
traffic *= 1 << 30
elif unit in ("mb", "mbyte", "megabyte", "mib", "m"):
traffic *= 1 << 20
elif unit in ("kb", "kib", "kilobyte", "kbyte", "k"):
traffic *= 1 << 10
return traffic
def lock(func):
def new(*args):
#print "Handler: %s args: %s" % (func,args[1:])
args[0].lock.acquire()
try:
return func(*args)
finally:
args[0].lock.release()
return new
def fixup(m):
text = m.group(0)
if text[:2] == "&#":
# character reference
try:
if text[:3] == "&#x":
return unichr(int(text[3:-1], 16))
else:
return unichr(int(text[2:-1]))
except ValueError:
pass
else:
# named entity
try:
name = text[1:-1]
text = unichr(name2codepoint[name])
except KeyError:
pass
return text # leave as is
def html_unescape(text):
"""Removes HTML or XML character references and entities from a text string"""
return re.sub("&#?\w+;", fixup, text)
if __name__ == "__main__":
print freeSpace(".")
print remove_chars("ab'cdgdsf''ds'", "'ghd")