MP3-Mplib

 view release on metacpan or  search on metacpan

Mplib.xs  view on Meta::CPAN

        
        if (strcmp(key, "WXXX") == 0) {
            SV *wxval = hv_iterval(t, iter_struct);
            if (isHaSHref(wxval)) {
                SV **wxurl, **wxdesc;
                HV *wxhsh = (HV *) SvRV(wxval);
                wxurl  = hv_fetch(wxhsh, "url", 3, FALSE);
                wxdesc = hv_fetch(wxhsh, "description", 11, FALSE);
                content = mp_assemble_wxxx_content(
                        wxurl  != NULL ? SvPV_nolen(*wxurl)  : "",
                        wxdesc != NULL ? SvPV_nolen(*wxdesc) : "",
                        enc);
            } else {
                val = SvPV_nolen(hv_iterval(t, iter_struct));
                content = mp_assemble_wxxx_content(
                        val != NULL ? val : "", "", enc);
            }
            mp_set_custom_content_at_pos(new_tag, "WXXX", content, 0);
            continue;
        } /* WXXX */

        /* all other frames */
        val = SvPV_nolen(hv_iterval(t, iter_struct));
        content = mp_assemble_text_content(val, enc);
        ret = mp_set_custom_content_at_pos(new_tag, key, content, 0);
        mp_free_content(content);

        if (ret != 0) { 
            sv_setpv(mp3_lib_err, "");
            sv_catpvf(mp3_lib_err, "%s%c%i", key, '\034', MP_EFNF);
        }
    }
    newlist = add_tag(taglist, new_tag);
    ret = mp_write_to_file(newlist, filename);
    mp_free_list(newlist);
                         
    return ret;
}

MODULE = MP3::Mplib		PACKAGE = MP3::Mplib		

double
constant(sv,arg)
    PREINIT:
	    STRLEN	len;
    INPUT:
	    SV * sv
        char * s = SvPV(sv, len);
        int	arg
    CODE:
        RETVAL = constant(s,len,arg);
    OUTPUT:
        RETVAL

void
get_header(filename)
        char * filename;
    PROTOTYPE: $
    INIT:
        mpeg_header * header;
    PPCODE:
        header = mp_get_mpeg_header_from_file(filename);
        if (header == NULL) 
            XSRETURN_UNDEF;
            
        EXTEND(SP, 1);
        PUSHs(sv_2mortal(map_mpeg_header_to_sv(header)));

void
get_tag(filename, ver)
        char * filename;
        int ver;
    PROTOTYPE: $$
    INIT:
        id3_tag_list * taglist;
        id3_tag * tag;
    PPCODE:
        taglist = mp_get_tag_list_from_file(filename);
        if (taglist == NULL)
            XSRETURN_UNDEF;
        
        tag = get_tag(taglist, ver);
        if (tag == NULL) 
            XSRETURN_UNDEF;
            
        EXTEND(SP, 1);
        PUSHs(sv_2mortal(map_id3_tag_to_sv(tag)));     
        mp_free_list(taglist);

void
get_id3v2_header(filename)
        char * filename;
    PROTOTYPE: $
    INIT:
        id3_tag_list * taglist;
        id3_tag * tag;
    PPCODE:
        taglist = mp_get_tag_list_from_file(filename);
        if (taglist == NULL)
            XSRETURN_UNDEF;
        tag = get_tag(taglist, 2);
        if (tag == NULL) 
            XSRETURN_UNDEF;
        EXTEND(SP, 1);
        PUSHs(sv_2mortal(map_id3v2_header_to_sv(((id3v2_tag*)tag->tag)->header)));
        mp_free_list(taglist);
        
void
set_tag (filename, ver, tag, enc = ISO_8859_1)
        char * filename;
        int ver;
        SV * tag;
        int enc;
    PREINIT:
        int ret;
    PROTOTYPE: $$$;$
    PPCODE:
        if ( (!SvROK(tag)) ||
             (SvTYPE(SvRV(tag)) != SVt_PVHV) )
            croak("MP3::Mplib::set_tag expects a hash-ref as third arg");

        if (ver == 1) 
            ret = set_v1_tag(filename, (HV *) SvRV(tag), enc);
        else if (ver == 2) 
            ret = set_v2_tag(filename, (HV *) SvRV(tag), enc);
        else
            croak("Unsupported tag version (v%i) in MP3::Mplib::set_header", 
                  ver);

        if (ret == MP_EERROR)
            sv_setpvf(mp3_lib_err, "mp_file\034%i", MP_EERROR);

        EXTEND(SP, 1);
        PUSHs(sv_2mortal(newSViv(ret == 0 ? 1 : 0)));

void
delete_tags(filename, ver)
        char * filename;
        int ver;
    PROTOTYPE: $$
    PPCODE:
        EXTEND(SP, 1);
        switch(mp_del_tags_by_ver_from_file(filename, ver)) {
            case 0: 
                PUSHs(sv_2mortal(newSVuv(1))); 
                break;
            case 1:
                PUSHs(sv_2mortal(newSVuv(0)));
                break;
        }

void 
_clean_up(filename)
        char * filename;
    PROTOTYPE: $
    PPCODE:
        id3_tag_list *taglist;
        id3_tag * tag;
        int i, j;

        taglist = mp_get_tag_list_from_file(filename);
        tag = get_tag(taglist, 2);
        
        if (tag == NULL) 
            XSRETURN_UNDEF;

        for (i = 0; i < V2FRAMES; i++) {
            j = 1;
            while (1) {
                if (mp_get_content_custom_at_pos(tag, fields[i], j))
                    mp_set_custom_content_at_pos(tag, (char*) fields[i], 
                                                 NULL, j);
                else
                    break;
                j++;
            }
        }
        if (mp_write_to_file(taglist, filename) == MP_EERROR) 
            sv_setpvf(mp3_lib_err, "mp_file\034%i", MP_EERROR);
        mp_free_list(taglist->first);

void
_dump_structure(filename)
        char * filename;
    INIT:
        id3_tag_list * taglist, *iter;
        int c = 0;
    PROTOTYPE: $
    PPCODE:
        taglist = mp_get_tag_list_from_file(filename);
        if (taglist == NULL) {
            printf("No tags found\n");
            XSRETURN_UNDEF;
        }
        iter = taglist;
        while (iter) {
            id3_tag *tag = iter->tag;
            printf("Tag at position %i:\n", ++c);
            printf("Version: %i", tag->version);
            if (tag->version == 2) {
                int i, j;
                id3v2_header* head = ((id3v2_tag*)tag->tag)->header;
                printf(" (id3v2.%i.%i)\n", head->version_minor, 
                                           head->version_revision);
                printf("Fields set:\n");
                for (i = 0; i < V2FRAMES; i++, j = 0) {
                    while (mp_get_content_custom_at_pos(tag, fields[i], j)) {
                        int k;
                        char ind[4*(j+1)+1];
                        for (k = 0; k < j+1; k++) {
                                strcpy(&ind[4*k], "    ");
                        }
                        ind[4*k+1] = 0;
                        printf("%s+%s at pos %i\n", ind, fields[i], j++);
                    }
                }
                printf("\n");
            }
            if (tag->version == 1) {
                int i;
                printf(" (id3v1.1)\n");
                printf("Fields set:\n");
                for (i = MP_ARTIST; i <= MP_TRACK; i++) {
                    if (mp_get_content(tag, i))
                        printf("\t+%s\n", fieldsv1[i - 1]);
                }
                printf("\n");
            }
            iter = iter->next;
        }
        mp_free_list(taglist);

BOOT:
    mp3_lib_err = get_sv("MP3::Mplib::Error", TRUE);



( run in 1.118 second using v1.01-cache-2.11-cpan-5511b514fd6 )