Skip to content

Commit

Permalink
add _destroy code for created objects via _new
Browse files Browse the repository at this point in the history
  • Loading branch information
M. Dietrich committed Aug 14, 2012
1 parent 3d93b09 commit 23e0d96
Show file tree
Hide file tree
Showing 5 changed files with 73 additions and 52 deletions.
2 changes: 2 additions & 0 deletions TODO
Expand Up @@ -7,3 +7,5 @@ Missing:
- shell

- test more devices

- fix filenames and unicode...
6 changes: 5 additions & 1 deletion examples/backup.py
Expand Up @@ -39,13 +39,17 @@ def main(root='.'):
for object_id, _object in objects.items():
if (_object['filetype'] != 'FOLDER'
# here you could filter files, i.e. by name:
#and _object['name'].startswith('IMG_')
and '20120813' in _object['name']
and _object['filetype'] == 'JPEG'
# and 'mp4' in _object['name']
):
name = base + '/' + determine_name(objects, **_object)
print('{} {} {filetype}'.format(object_id, name, **_object))
try: makedirs(dirname(name))
except: pass
mtp.get_file_to_file(object_id, name)
else:
pass # print('{}: {}'.format(object_id, _object))
except:
for n in mtp.get_errorstack():
print('{errornumber}: {error_text}'.format(**n))
Expand Down
18 changes: 8 additions & 10 deletions examples/createplaylist.py
Expand Up @@ -18,16 +18,14 @@ def upload_track(mtp, parent_id, source):
def main(name, *files):
with MediaTransfer() as mtp:
try:
parent_id = mtp.get_deviceinfo()['default_music_folder'] or 0xffffffff
if 1:
tracks = 3605, 3606,
else:
tracks = list()
for track in files:
track = upload_track(mtp, parent_id, track)
tracks.append(track)
parent_id = mtp.get_deviceinfo()['default_playlist_folder'] or 0
object_id = mtp.create_playlist(name, tracks, parent_id)
# parent_id = mtp.get_deviceinfo()['default_music_folder'] or 0xffffffff
# tracks = list()
# for track in files:
# track = upload_track(mtp, parent_id, track)
# tracks.append(track)
# parent_id = mtp.get_deviceinfo()['default_playlist_folder'] or 0
# object_id = mtp.create_playlist(name, tracks, parent_id)
object_id = mtp.create_playlist(name, [4265, ])
print("Created new playlist with ID: {object_id}".format(object_id=object_id))
except Exception, e:
for n in mtp.get_errorstack():
Expand Down
76 changes: 38 additions & 38 deletions libmtp.pxd
Expand Up @@ -2,40 +2,8 @@
# Generated by command /home/mdt/Source/oss/cython-codegen/scripts/xml2cython.py -o libmtp.pxd -l libmtp libmtp.h libmtp.xml
# Codegenlib version 0.3dev
cdef extern from 'libmtp.h':
ctypedef unsigned int uint32_t
ctypedef unsigned int uint32_t
cdef struct LIBMTP_folder_struct:
uint32_t folder_id
uint32_t parent_id
uint32_t storage_id
char * name
LIBMTP_folder_struct * sibling
LIBMTP_folder_struct * child
ctypedef unsigned int uint32_t
ctypedef unsigned int uint32_t
cdef struct LIBMTP_folder_struct:
uint32_t folder_id
uint32_t parent_id
uint32_t storage_id
char * name
LIBMTP_folder_struct * sibling
LIBMTP_folder_struct * child
cdef struct LIBMTP_folder_struct:
uint32_t folder_id
uint32_t parent_id
uint32_t storage_id
char * name
LIBMTP_folder_struct * sibling
LIBMTP_folder_struct * child
cdef struct LIBMTP_folder_struct:
uint32_t folder_id
uint32_t parent_id
uint32_t storage_id
char * name
LIBMTP_folder_struct * sibling
LIBMTP_folder_struct * child
ctypedef LIBMTP_folder_struct LIBMTP_folder_t
ctypedef unsigned char uint8_t
ctypedef unsigned int uint32_t
ctypedef short unsigned int uint16_t
ctypedef long unsigned int uint64_t
ctypedef unsigned int uint32_t
Expand Down Expand Up @@ -349,6 +317,38 @@ cdef extern from 'libmtp.h':
int cached
LIBMTP_mtpdevice_struct * next
ctypedef LIBMTP_mtpdevice_struct LIBMTP_mtpdevice_t
ctypedef unsigned int uint32_t
cdef struct LIBMTP_folder_struct:
uint32_t folder_id
uint32_t parent_id
uint32_t storage_id
char * name
LIBMTP_folder_struct * sibling
LIBMTP_folder_struct * child
ctypedef unsigned int uint32_t
ctypedef unsigned int uint32_t
cdef struct LIBMTP_folder_struct:
uint32_t folder_id
uint32_t parent_id
uint32_t storage_id
char * name
LIBMTP_folder_struct * sibling
LIBMTP_folder_struct * child
cdef struct LIBMTP_folder_struct:
uint32_t folder_id
uint32_t parent_id
uint32_t storage_id
char * name
LIBMTP_folder_struct * sibling
LIBMTP_folder_struct * child
cdef struct LIBMTP_folder_struct:
uint32_t folder_id
uint32_t parent_id
uint32_t storage_id
char * name
LIBMTP_folder_struct * sibling
LIBMTP_folder_struct * child
ctypedef LIBMTP_folder_struct LIBMTP_folder_t
int LIBMTP_Set_Folder_Name(LIBMTP_mtpdevice_t *, LIBMTP_folder_t *, char *)
cdef enum:
LIBMTP_FILETYPE_FOLDER = 0
Expand Down Expand Up @@ -884,7 +884,6 @@ cdef extern from 'libmtp.h':
int LIBMTP_Get_Secure_Time(LIBMTP_mtpdevice_t *, char * *)
ctypedef int(*LIBMTP_progressfunc_t)(uint64_t, uint64_t, void *)
int LIBMTP_Get_File_To_File(LIBMTP_mtpdevice_t *, uint32_t, char *, LIBMTP_progressfunc_t, void *)
int LIBMTP_Set_File_Name(LIBMTP_mtpdevice_t *, LIBMTP_file_t *, char *)
ctypedef unsigned int uint32_t
cdef struct LIBMTP_playlist_struct:
uint32_t playlist_id
Expand Down Expand Up @@ -1940,6 +1939,7 @@ cdef extern from 'libmtp.h':
LIBMTP_PROPERTY_UNKNOWN = 167
int LIBMTP_Set_Object_u16(LIBMTP_mtpdevice_t *, uint32_t, int, uint16_t)
int LIBMTP_Set_Syncpartner(LIBMTP_mtpdevice_t *, char *)
LIBMTP_mtpdevice_t * LIBMTP_Get_First_Device()
char * LIBMTP_Get_Friendlyname(LIBMTP_mtpdevice_t *)
int LIBMTP_Set_Album_Name(LIBMTP_mtpdevice_t *, LIBMTP_album_t *, char *)
cdef enum:
Expand Down Expand Up @@ -2492,7 +2492,7 @@ cdef extern from 'libmtp.h':
void LIBMTP_Dump_Errorstack(LIBMTP_mtpdevice_t *)
void LIBMTP_Set_Debug(int)
LIBMTP_folder_t * LIBMTP_Get_Folder_List(LIBMTP_mtpdevice_t *)
int LIBMTP_Get_Storage(LIBMTP_mtpdevice_t *, int)
int LIBMTP_Send_Track_From_File_Descriptor(LIBMTP_mtpdevice_t *, int, LIBMTP_track_t *, LIBMTP_progressfunc_t, void *)
LIBMTP_file_t * LIBMTP_new_file_t()
char * LIBMTP_Get_Filetype_Description(LIBMTP_filetype_t)
LIBMTP_file_t * LIBMTP_Get_Filelisting(LIBMTP_mtpdevice_t *)
Expand Down Expand Up @@ -3541,7 +3541,7 @@ cdef extern from 'libmtp.h':
LIBMTP_PROPERTY_UNKNOWN = 167
char * LIBMTP_Get_Property_Description(int)
int LIBMTP_Set_Object_Filename(LIBMTP_mtpdevice_t *, uint32_t, char *)
int LIBMTP_Delete_Object(LIBMTP_mtpdevice_t *, uint32_t)
int LIBMTP_Set_File_Name(LIBMTP_mtpdevice_t *, LIBMTP_file_t *, char *)
void LIBMTP_destroy_album_t(LIBMTP_album_t *)
int LIBMTP_Send_File_From_File(LIBMTP_mtpdevice_t *, char *, LIBMTP_file_t *, LIBMTP_progressfunc_t, void *)
int LIBMTP_Format_Storage(LIBMTP_mtpdevice_t *, LIBMTP_devicestorage_t *)
Expand Down Expand Up @@ -5160,7 +5160,7 @@ cdef extern from 'libmtp.h':
LIBMTP_folder_t * LIBMTP_Find_Folder(LIBMTP_folder_t *, uint32_t)
LIBMTP_playlist_t * LIBMTP_Get_Playlist(LIBMTP_mtpdevice_t *, uint32_t)
LIBMTP_playlist_t * LIBMTP_new_playlist_t()
int LIBMTP_Send_Track_From_File_Descriptor(LIBMTP_mtpdevice_t *, int, LIBMTP_track_t *, LIBMTP_progressfunc_t, void *)
int LIBMTP_Get_Storage(LIBMTP_mtpdevice_t *, int)
cdef enum:
LIBMTP_PROPERTY_StorageID = 0
cdef enum:
Expand Down Expand Up @@ -5669,7 +5669,7 @@ cdef extern from 'libmtp.h':
int LIBMTP_Get_Allowed_Property_Values(LIBMTP_mtpdevice_t *, int, LIBMTP_filetype_t, LIBMTP_allowed_values_t *)
int LIBMTP_Get_Supported_Filetypes(LIBMTP_mtpdevice_t *, uint16_t * *, uint16_t *)
int LIBMTP_Send_File_From_File_Descriptor(LIBMTP_mtpdevice_t *, int, LIBMTP_file_t *, LIBMTP_progressfunc_t, void *)
LIBMTP_mtpdevice_t * LIBMTP_Get_First_Device()
int LIBMTP_Delete_Object(LIBMTP_mtpdevice_t *, uint32_t)
cdef enum:
LIBMTP_PROPERTY_StorageID = 0
cdef enum:
Expand Down
23 changes: 20 additions & 3 deletions mtp.pyx
Expand Up @@ -21,6 +21,7 @@ cdef extern from 'stdlib.h':
void* malloc(int)
void free(void*)
ctypedef char* const_char_ptr 'const char*'
char* strdup(const_char_ptr)

from libmtp cimport *

Expand Down Expand Up @@ -423,8 +424,9 @@ cdef class MediaTransfer(object):
current.parent_id = parent_id
current.filetype = self.find_filetype(source)
current.filesize = stat(source).st_size
print('sending starts')
r = LIBMTP_Send_File_From_File(self.device, source, current, NULL, NULL)
current.filename = NULL
LIBMTP_destroy_file_t(current)
if r != 0:
raise Exception('LIBMTP_Send_File_From_File error={}'.format(r))
return dict(
Expand All @@ -441,7 +443,7 @@ cdef class MediaTransfer(object):
album=None, artist=None, bitrate=None, bitratetype=None,
composer=None, date=None, duration=None, filename=None, genre=None,
name=None, nochannels=None, rating=None, samplerate=None,
title=None, tracknumber=None, usecount=None, wavecodec=None, ):
title=None, tracknumber=None, usecount=None, wavecodec=None, **unused):
cdef LIBMTP_track_t* current = NULL
cdef int r = 0
if not self.device:
Expand Down Expand Up @@ -476,6 +478,14 @@ cdef class MediaTransfer(object):
if usecount : current.usecount = int(usecount)
if wavecodec : current.wavecodec = int(wavecodec)
r = LIBMTP_Send_Track_From_File(self.device, source, current, NULL, NULL)
current.album = NULL
current.artist = NULL
current.composer = NULL
current.date = NULL
current.filename = NULL
current.genre = NULL
current.title = NULL
LIBMTP_destroy_track_t(current)
if r != 0:
raise Exception('LIBMTP_Send_Track_From_File error={}'.format(r))
return dict(
Expand Down Expand Up @@ -535,6 +545,7 @@ cdef class MediaTransfer(object):
current.parent_id = int(parent_id)
current.storage_id = int(storage_id)
current.name = name
current.next = NULL
current.tracks = NULL
current.no_tracks = int(len(tracks))
if current.no_tracks > 0:
Expand All @@ -544,9 +555,13 @@ cdef class MediaTransfer(object):
r = LIBMTP_Create_New_Playlist(self.device, current)
if current.tracks != NULL:
free(current.tracks)
current.tracks = NULL # libmtp will free() this otherwise
current.name = NULL # libmtp will free() this otherwise
object_id = current.playlist_id
LIBMTP_destroy_playlist_t(current)
if r < 0:
raise Exception('LIBMTP_Create_New_Playlist error={}'.format(r))
return current.playlist_id
return object_id

def update_playlist(self, **metadata):
cdef LIBMTP_playlist_t* current = NULL
Expand All @@ -557,6 +572,8 @@ cdef class MediaTransfer(object):
if current == NULL:
raise Exception('LIBMTP_new_playlist_t failed')
r = LIBMTP_Update_Playlist(self.device, current)
current.name = NULL # libmtp will free() this otherwise
LIBMTP_destroy_playlist_t(current)
if r < 0:
raise Exception('LIBMTP_Update_Playlist error={}'.format(r))
return current.playlist_id
Expand Down

0 comments on commit 23e0d96

Please sign in to comment.