LoginSignup
1
0

MediaWikiのApiを使ってファイルの実URLを取得する

Last updated at Posted at 2024-02-22

画像のURLの取得

function getImageURL(filename){
    // スペース文字をアンダースコアに
    filename = filename.replaceAll(" ", "_");

    // Apiを呼び出す
    return $.Deferred().promise( function() {
		return new mw.Api().get( {
            action: 'query',
            titles: "File:" + filename,
            prop: 'imageinfo',
            iiprop: 'url'
        });
    }).then(function( data ){
        // 受け取ったのはオブジェクトか?
        if(typeof data === "object"){
            // クエリの結果からpageIDを取得
            var pageid = Object.keys( data.query.pages )[0];

            // ファイルが存在する場合はpageID > -1
            if (pageid > -1){
                // URLを返す
                return data.query.pages[ pageid ].imageinfo[0].url;
            }
        }
        return "存在しないファイル名です";
    }).fail(function(){
        return "APIの呼び出しに失敗しました";
    });
}

オーディオファイルの情報を取得

オーディオファイルの場合imageinfoではなくvideoinfoクエリーを使用する。
こちらは<audio/>タグで再生可能な必要情報も含める例。

function getVideInfo(filename) {

    // メタデータ情報をObjectで返す関数
    function meta2obj(value){
        if(typeof value === 'object' && Array.isArray(value)){
            var obj = {}, idx = 0;
            value.forEach( function( v, i ){
                if(v.hasOwnProperty("name") && v.hasOwnProperty("value")){
                    if(typeof v.name === 'number'){
                        obj[idx++] = {
                            id: v.name,
                            data: meta2obj(v.value)
                        };
                    } else {
                        obj[v.name] = meta2obj(v.value);
                    }
                }
            });
            return obj;
        }
        return value;
    }

    // スペース文字をアンダースコアに
    filename = filename.replaceAll(" ", "_");

    // Apiを呼び出す
    return $.Deferred().promise(function () {
        return new mw.Api().get({
            action: 'query',
            titles: "File:" + filename,
            prop: 'videoinfo',
            viprop: 'url|mime|metadata'
        });
    }).then(function (data) {
        // 受け取ったのはオブジェクトか?
        if(typeof data === "object"){
            // クエリの結果からpageIDを取得
            var pageid = Object.keys( data.query.pages )[0];
            // ファイルが存在する場合はpageID > -1
            if (pageid > -1) {
                var info = data.query.pages[ pageid ].videoinfo[0];
                var metadata = meta2obj( info.metadata );
                return {
                    // URL
                    url: info.url,
                    // MIME-Type + Cordec
                    type: info.mime.replace(/application/, "audio") + "; codecs='" + metadata.streams[0].data.type + "'"
                };
            }
        }
        return { error: "存在しないファイル名です" };
    }).fail(function () {
        return { error: "APIの呼び出しに失敗しました" };
    });
}
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0