mirror of
https://github.com/robweber/xbmcbackup.git
synced 2024-12-22 14:05:23 +01:00
these were missed in the last commit
This commit is contained in:
parent
1d320cd601
commit
20b15eb051
0
resources/lib/__init__.py
Normal file
0
resources/lib/__init__.py
Normal file
252
resources/lib/vfs.py
Normal file
252
resources/lib/vfs.py
Normal file
@ -0,0 +1,252 @@
|
||||
'''
|
||||
Convenience wrappers and extensions for some commonly used VFS functions
|
||||
in XBMC addons. This module exposes all the functionality of xbmcvfs plus
|
||||
some extra functions.
|
||||
|
||||
Copyright (C) 2012 Patrick Carey
|
||||
|
||||
This program is free software: you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation, either version 3 of the License, or
|
||||
(at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
'''
|
||||
|
||||
import json
|
||||
import os
|
||||
import xbmc
|
||||
import xbmcvfs
|
||||
|
||||
|
||||
def walk(path):
|
||||
|
||||
'''
|
||||
Reimplementation of os.walk using XBMC's jsonrpc API.
|
||||
|
||||
This has the nice added benefits of being able to walk remote
|
||||
directories and inside compressed files such as rars/zips.
|
||||
'''
|
||||
|
||||
dir_tree = [[path]]
|
||||
|
||||
current_depth = 0
|
||||
|
||||
while True:
|
||||
|
||||
if current_depth > -1:
|
||||
|
||||
try:
|
||||
|
||||
current_path = dir_tree[current_depth].pop(0)
|
||||
current_dirs, current_files = [], []
|
||||
|
||||
for x in listdir(current_path, extra_metadata=True):
|
||||
|
||||
if x['filetype'] == 'directory':
|
||||
|
||||
current_dirs.append(x['file'])
|
||||
|
||||
else:
|
||||
|
||||
current_files.append(x['file'])
|
||||
|
||||
except IndexError:
|
||||
|
||||
current_depth -= 1
|
||||
|
||||
dir_tree.pop()
|
||||
|
||||
else:
|
||||
|
||||
yield (current_path, current_dirs, current_files)
|
||||
|
||||
if current_dirs:
|
||||
|
||||
current_depth += 1
|
||||
|
||||
dir_tree.append(current_dirs)
|
||||
|
||||
else:
|
||||
|
||||
break
|
||||
|
||||
|
||||
def listdir(path, extra_metadata=False):
|
||||
|
||||
'''
|
||||
Reimplementation of os.listdir using XBMC's jsonrpc API.
|
||||
|
||||
Returns a list of file/directory names from the specified path
|
||||
|
||||
Accepts an optional boolean 'extra_metadata' as the second argument
|
||||
which will cause the function to instead return a list of dictionaries
|
||||
containing all of the metadata about each file that was retrieved from
|
||||
XBMC.
|
||||
'''
|
||||
|
||||
fileList = []
|
||||
|
||||
json_response = xbmc.executeJSONRPC('{ "jsonrpc" : "2.0" , "method" : "Files.GetDirectory" , "params" : { "directory" : "%s" , "sort" : { "method" : "file" } } , "id" : 1 }' % path.encode('utf-8').replace('\\', '\\\\'))
|
||||
|
||||
jsonobject = json.loads(json_response)
|
||||
|
||||
if jsonobject['result']['files']:
|
||||
|
||||
for item in jsonobject['result']['files']:
|
||||
|
||||
if extra_metadata:
|
||||
|
||||
fileList.append(item)
|
||||
|
||||
else:
|
||||
|
||||
fileList.append(item['file'])
|
||||
|
||||
return fileList
|
||||
|
||||
|
||||
def copy(source, destination):
|
||||
|
||||
"""
|
||||
copy(source, destination) -- Copy file to destination, returns true/false.
|
||||
|
||||
source : file to copy.
|
||||
destination : destination file
|
||||
|
||||
example:
|
||||
- success = vfs.copy(source, destination)
|
||||
"""
|
||||
|
||||
return xbmcvfs.copy(source, destination)
|
||||
|
||||
|
||||
def delete(path):
|
||||
|
||||
"""
|
||||
delete(file) -- Delete file
|
||||
|
||||
file : file to delete
|
||||
|
||||
example:
|
||||
- vfs.delete(file)
|
||||
"""
|
||||
|
||||
return xbmcvfs.delete(path)
|
||||
|
||||
|
||||
def exists(path):
|
||||
|
||||
"""
|
||||
exists(path) -- Check if file exists, returns true/false.
|
||||
|
||||
path : file or folder
|
||||
|
||||
example:
|
||||
- success = vfs.exists(path)
|
||||
"""
|
||||
|
||||
return xbmcvfs.exists(path)
|
||||
|
||||
|
||||
def mkdir(path):
|
||||
|
||||
"""
|
||||
mkdir(path) -- Create a folder.
|
||||
|
||||
path : folder
|
||||
|
||||
example:
|
||||
- success = vfs.mkdir(path)
|
||||
"""
|
||||
|
||||
return xbmcvfs.mkdir(path)
|
||||
|
||||
|
||||
def rename(source, target):
|
||||
|
||||
"""
|
||||
rename(file, newFileName) -- Rename file, returns true/false.
|
||||
|
||||
file : file to reaname
|
||||
newFileName : new filename, including the full path
|
||||
|
||||
example:
|
||||
- success = vfs.rename(file, newFileName)
|
||||
"""
|
||||
|
||||
return xbmcvfs.rename(source, target)
|
||||
|
||||
|
||||
def rmdir(path):
|
||||
|
||||
"""
|
||||
rmdir(path) -- Remove a folder.
|
||||
|
||||
path : folder
|
||||
|
||||
example:
|
||||
- success = vfs.rmdir(path)
|
||||
"""
|
||||
|
||||
return xbmcvfs.rmdir(path)
|
||||
|
||||
|
||||
def comparepathlists(list1, list2, fullpath=False):
|
||||
|
||||
"""
|
||||
comparepathlists(list1, list2) -- Compare two lists of paths
|
||||
|
||||
list1 : list, contains paths (local or remote, absolute or relative)
|
||||
list2 : list, contains paths (local or remote, absolute or relative)
|
||||
fullpath : boolean, set True to compare perform straight comparison of lists
|
||||
set False (default) to compare on filename portions of each list
|
||||
|
||||
returns: dictionary:
|
||||
common_items: list, contains paths of items common to both lists
|
||||
list1_items: list, contains paths of items found only in list1
|
||||
list2_items: list, contains paths of items found only in list2
|
||||
|
||||
example:
|
||||
- compare = comparepathlists(list1, list2)
|
||||
"""
|
||||
|
||||
# initialise dict to store results and temp data
|
||||
results = {}
|
||||
temp_data = {}
|
||||
|
||||
if fullpath:
|
||||
|
||||
temp_path = lambda x: x
|
||||
|
||||
else:
|
||||
|
||||
temp_path = lambda x: os.path.split(x)[1]
|
||||
|
||||
for path in list1:
|
||||
|
||||
temp_data['list1'].append(temp_path(path))
|
||||
|
||||
for path in list2:
|
||||
|
||||
temp_data['list2'].append(temp_path(path))
|
||||
|
||||
# get items not in list 2
|
||||
results['list1_items'] = []
|
||||
gen = (i for i, x in enumerate(temp_data['list1']) if not x in temp_data['list2'])
|
||||
for i in gen:
|
||||
results['list1_items'].append(list1[i])
|
||||
|
||||
# get items not in list 1
|
||||
results['list2_items'] = []
|
||||
gen = (i for i, x in enumerate(temp_data['list2']) if not x in temp_data['list1'])
|
||||
for i in gen:
|
||||
results['list2_items'].append(list2[i])
|
||||
|
||||
return results
|
Loading…
Reference in New Issue
Block a user