rynn-k / gists
hanime.js javascript
const axios = require('axios');
const crypto = require('crypto');

class Hanime {
    search = async function (query, page = 0) {
        try {
            if (!query) throw new Error('Query is required.');
            if (isNaN(page)) throw new Error('Page must be a number.');
            
            const { data } = await axios.post(`https://cloudflare-cors-anywhere.supershadowcube.workers.dev/?url=${encodeURIComponent('https://search.htv-services.com/search')}`, {
                search_text: query,
                tags: [],
                tags_mode: 'AND',
                brands: [],
                blacklist: [],
                order_by: 'created_at_unix',
                ordering: 'desc',
                page: parseInt(page)
            }, {
                headers: {
                    'content-type': 'application/json;charset=UTF-8',
                    origin: 'https://hanime.tv',
                    referer: 'https://hanime.tv/',
                    'user-agent': 'Mozilla/5.0 (Linux; Android 10; K) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Mobile Safari/537.36'
                }
            });
            
            if (data.hits && typeof data.hits === 'string') data.hits = JSON.parse(data.hits);
            
            return {
                currentPage: parseInt(page),
                totalPages: data.nbPages,
                contents: data.hits.map(hit => ({
                    ...hit,
                    url: 'https://hanime.tv/videos/hentai/' + hit.slug
                }))
            };
        } catch (error) {
            throw new Error(error.message);
        }
    }
    
    detail = async function (url) {
        try {
            if (!url.includes('hanime.tv/videos/hentai/')) throw new Error('Invalid url.');
            
            const { data } = await axios.get(`https://cloudflare-cors-anywhere.supershadowcube.workers.dev/?url=${encodeURIComponent(`https://hanime.tv/api/v8/video?id=${url.split('/').pop()}`)}`, {
                headers: {
                    'x-signature-version': 'web2',
                    'x-signature': crypto.randomBytes(32).toString('hex'),
                    'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/127.0.0.0 Safari/537.36'
                }
            });
            
            return {
                metadata: {
                    ...data.hentai_video,
                    hentai_tags: data.hentai_video.hentai_tags.map(tag => tag.text),
                    titles: data.hentai_video.titles.map(t => t.title)
                },
                hentai_franchise: data.hentai_franchise_hentai_videos.map(vid => ({
                    ...vid,
                    url: 'https://hanime.tv/videos/hentai/' + vid.slug
                }))
            };
        } catch (error) {
            throw new Error(error.message);
        }
    }
}

// Usage:
const h = new Hanime();
h.detail('https://hanime.tv/videos/hentai/sayuri-s-mother-in-law-1').then(console.log);
3040 bytes ยท Updated Mar 10, 2026