mirror of https://github.com/aruppi/aruppi-api.git
Aruppi start to powers!
parent
a0c18737d3
commit
32b46fe7a6
@ -0,0 +1,38 @@
|
||||
---
|
||||
name: Bug report
|
||||
about: Create a report to help us improve
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Describe the bug**
|
||||
A clear and concise description of what the bug is.
|
||||
|
||||
**To Reproduce**
|
||||
Steps to reproduce the behavior:
|
||||
1. Go to '...'
|
||||
2. Click on '....'
|
||||
3. Scroll down to '....'
|
||||
4. See error
|
||||
|
||||
**Expected behavior**
|
||||
A clear and concise description of what you expected to happen.
|
||||
|
||||
**Screenshots**
|
||||
If applicable, add screenshots to help explain your problem.
|
||||
|
||||
**Desktop (please complete the following information):**
|
||||
- OS: [e.g. iOS]
|
||||
- Browser [e.g. chrome, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Smartphone (please complete the following information):**
|
||||
- Device: [e.g. iPhone6]
|
||||
- OS: [e.g. iOS8.1]
|
||||
- Browser [e.g. stock browser, safari]
|
||||
- Version [e.g. 22]
|
||||
|
||||
**Additional context**
|
||||
Add any other context about the problem here.
|
@ -0,0 +1,20 @@
|
||||
---
|
||||
name: Feature request
|
||||
about: Suggest an idea for this project
|
||||
title: ''
|
||||
labels: ''
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
**Is your feature request related to a problem? Please describe.**
|
||||
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||
|
||||
**Describe the solution you'd like**
|
||||
A clear and concise description of what you want to happen.
|
||||
|
||||
**Describe alternatives you've considered**
|
||||
A clear and concise description of any alternative solutions or features you've considered.
|
||||
|
||||
**Additional context**
|
||||
Add any other context or screenshots about the feature request here.
|
@ -0,0 +1,24 @@
|
||||
name: Node.js CI
|
||||
|
||||
on: [push]
|
||||
|
||||
jobs:
|
||||
build:
|
||||
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [8.x, 10.x, 12.x]
|
||||
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- name: Use Node.js ${{ matrix.node-version }}
|
||||
uses: actions/setup-node@v1
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}
|
||||
- run: npm install
|
||||
- run: npm run build --if-present
|
||||
- run: npm test
|
||||
env:
|
||||
CI: true
|
@ -0,0 +1,193 @@
|
||||
# Logs
|
||||
logs
|
||||
*.log
|
||||
npm-debug.log*
|
||||
yarn-debug.log*
|
||||
yarn-error.log*
|
||||
lerna-debug.log*
|
||||
|
||||
# Diagnostic reports (https://nodejs.org/api/report.html)
|
||||
report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json
|
||||
|
||||
# Runtime data
|
||||
pids
|
||||
*.pid
|
||||
*.seed
|
||||
*.pid.lock
|
||||
|
||||
# Directory for instrumented libs generated by jscoverage/JSCover
|
||||
lib-cov
|
||||
|
||||
# Coverage directory used by tools like istanbul
|
||||
coverage
|
||||
*.lcov
|
||||
|
||||
# nyc test coverage
|
||||
.nyc_output
|
||||
|
||||
# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files)
|
||||
.grunt
|
||||
|
||||
# Bower dependency directory (https://bower.io/)
|
||||
bower_components
|
||||
|
||||
# node-waf configuration
|
||||
.lock-wscript
|
||||
|
||||
# Compiled binary addons (https://nodejs.org/api/addons.html)
|
||||
build/Release
|
||||
|
||||
# Dependency directories
|
||||
node_modules/
|
||||
jspm_packages/
|
||||
|
||||
# TypeScript v1 declaration files
|
||||
typings/
|
||||
|
||||
# Snowpack dependency directory (https://snowpack.dev/)
|
||||
web_modules/
|
||||
|
||||
# TypeScript cache
|
||||
*.tsbuildinfo
|
||||
|
||||
# Optional npm cache directory
|
||||
.npm
|
||||
|
||||
# Optional eslint cache
|
||||
.eslintcache
|
||||
|
||||
# Microbundle cache
|
||||
.rpt2_cache/
|
||||
.rts2_cache_cjs/
|
||||
.rts2_cache_es/
|
||||
.rts2_cache_umd/
|
||||
|
||||
# Optional REPL history
|
||||
.node_repl_history
|
||||
|
||||
# Output of 'npm pack'
|
||||
*.tgz
|
||||
|
||||
# Yarn Integrity file
|
||||
.yarn-integrity
|
||||
|
||||
# dotenv environment variables file
|
||||
.env
|
||||
.env.test
|
||||
|
||||
# parcel-bundler cache (https://parceljs.org/)
|
||||
.cache
|
||||
.parcel-cache
|
||||
|
||||
# Next.js build output
|
||||
.next
|
||||
out
|
||||
|
||||
# Nuxt.js build / generate output
|
||||
.nuxt
|
||||
dist
|
||||
|
||||
# Gatsby files
|
||||
.cache/
|
||||
# Comment in the public line in if your project uses Gatsby and not Next.js
|
||||
# https://nextjs.org/blog/next-9-1#public-directory-support
|
||||
# public
|
||||
|
||||
# vuepress build output
|
||||
.vuepress/dist
|
||||
|
||||
# Serverless directories
|
||||
.serverless/
|
||||
|
||||
# FuseBox cache
|
||||
.fusebox/
|
||||
|
||||
# DynamoDB Local files
|
||||
.dynamodb/
|
||||
|
||||
# TernJS port file
|
||||
.tern-port
|
||||
|
||||
# Stores VSCode versions used for testing VSCode extensions
|
||||
.vscode-test
|
||||
|
||||
# yarn v2
|
||||
.yarn/cache
|
||||
.yarn/unplugged
|
||||
.yarn/build-state.yml
|
||||
.yarn/install-state.gz
|
||||
.pnp.*
|
||||
|
||||
# User-specific stuff
|
||||
.idea/**/workspace.xml
|
||||
.idea/**/tasks.xml
|
||||
.idea/**/usage.statistics.xml
|
||||
.idea/**/dictionaries
|
||||
.idea/**/shelf
|
||||
|
||||
# Generated files
|
||||
.idea/**/contentModel.xml
|
||||
|
||||
# Sensitive or high-churn files
|
||||
.idea/**/dataSources/
|
||||
.idea/**/dataSources.ids
|
||||
.idea/**/dataSources.local.xml
|
||||
.idea/**/sqlDataSources.xml
|
||||
.idea/**/dynamic.xml
|
||||
.idea/**/uiDesigner.xml
|
||||
.idea/**/dbnavigator.xml
|
||||
|
||||
# Gradle
|
||||
.idea/**/gradle.xml
|
||||
.idea/**/libraries
|
||||
|
||||
# Gradle and Maven with auto-import
|
||||
# When using Gradle or Maven with auto-import, you should exclude module files,
|
||||
# since they will be recreated, and may cause churn. Uncomment if using
|
||||
# auto-import.
|
||||
# .idea/artifacts
|
||||
# .idea/compiler.xml
|
||||
# .idea/jarRepositories.xml
|
||||
# .idea/modules.xml
|
||||
# .idea/*.iml
|
||||
# .idea/modules
|
||||
# *.iml
|
||||
# *.ipr
|
||||
|
||||
# CMake
|
||||
cmake-build-*/
|
||||
|
||||
# Mongo Explorer plugin
|
||||
.idea/**/mongoSettings.xml
|
||||
|
||||
# File-based project format
|
||||
*.iws
|
||||
|
||||
# IntelliJ
|
||||
out/
|
||||
|
||||
# mpeltonen/sbt-idea plugin
|
||||
.idea_modules/
|
||||
|
||||
# JIRA plugin
|
||||
atlassian-ide-plugin.xml
|
||||
|
||||
# Cursive Clojure plugin
|
||||
.idea/replstate.xml
|
||||
|
||||
# Crashlytics plugin (for Android Studio and IntelliJ)
|
||||
com_crashlytics_export_strings.xml
|
||||
crashlytics.properties
|
||||
crashlytics-build.properties
|
||||
fabric.properties
|
||||
|
||||
# Editor-based Rest Client
|
||||
.idea/httpRequests
|
||||
|
||||
# Android studio 3.1+ serialized cache file
|
||||
.idea/caches/build_file_checksums.ser
|
||||
|
||||
# exclude apidocs
|
||||
animeflv-docs/
|
||||
|
||||
.idea/
|
@ -0,0 +1,21 @@
|
||||
MIT License
|
||||
|
||||
Copyright (c) 2020 Jéluchu
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in all
|
||||
copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
@ -0,0 +1,4 @@
|
||||
#! /bin/bash
|
||||
|
||||
git log --oneline --all --graph --decorate $(git reflog | awk '{print $1}')
|
||||
|
@ -0,0 +1,13 @@
|
||||
{
|
||||
"name": "aruppi",
|
||||
"version": 2,
|
||||
"builds": [
|
||||
{
|
||||
"src": "./src/index.js",
|
||||
"use": "@now/node-server"
|
||||
}
|
||||
],
|
||||
"routes": [
|
||||
{ "src": "/(.*)", "dest": "/src/index.js" }
|
||||
]
|
||||
}
|
File diff suppressed because it is too large
Load Diff
@ -0,0 +1,58 @@
|
||||
{
|
||||
"name": "aruppi",
|
||||
"version": "1.0.0",
|
||||
"description": "Aruppi is a custom API to obtain data from the Japanese culture for the mobile app",
|
||||
"main": "./src/api/api.js",
|
||||
"scripts": {
|
||||
"start": "node src/index.js"
|
||||
},
|
||||
"keywords": [
|
||||
"aruppi",
|
||||
"aruppi api",
|
||||
"aruppi app",
|
||||
"aruppi android"
|
||||
],
|
||||
"author": {
|
||||
"name": "Jéluchu",
|
||||
"email": "infoaruppi@gmail.com",
|
||||
"reason": "Android Developer and Others",
|
||||
"url": "https://jeluchu.github.io/",
|
||||
"social": {
|
||||
"github": "https://github.com/Jeluchu",
|
||||
"twitter": "https://twitter.com/Jeluchu"
|
||||
}
|
||||
},
|
||||
"contributors": [
|
||||
{
|
||||
"name": "Darkangeel",
|
||||
"url": "https://github.com/Darkangeel-hd",
|
||||
"reason": "System administration authority (SYSADM)"
|
||||
}
|
||||
],
|
||||
"engines": {
|
||||
"node": ">= 10.16.x",
|
||||
"npm": ">= 6.9.x"
|
||||
},
|
||||
"bugs": {
|
||||
"url": "https://github.com/aruppi/aruppi-api/issues"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
"url": "https://github.com/aruppi/aruppi-api.git"
|
||||
},
|
||||
"dependencies": {
|
||||
"body-parser": "^1.19.0",
|
||||
"cheerio": "^1.0.0-rc.3",
|
||||
"cheerio-tableparser": "^1.0.1",
|
||||
"cloudscraper": "^4.6.0",
|
||||
"compose-middleware": "^5.0.1",
|
||||
"cors": "^2.8.5",
|
||||
"express": "^4.16.4",
|
||||
"helmet": "^3.22.0",
|
||||
"image-to-base64": "^2.1.0",
|
||||
"morgan": "^1.10.0",
|
||||
"node-fetch": "^2.6.0",
|
||||
"npm": "^6.14.5",
|
||||
"request": "^2.88.0"
|
||||
}
|
||||
}
|
@ -0,0 +1,65 @@
|
||||
const cheerio = require('cheerio');
|
||||
const cheerioTableparser = require('cheerio-tableparser');
|
||||
const cloudscraper = require('cloudscraper');
|
||||
const {
|
||||
BASE_ANIMEFLV , BASE_JIKAN
|
||||
} = require('./urls');
|
||||
|
||||
const schedule = async (day) =>{
|
||||
|
||||
const data = await cloudscraper.get(`${BASE_JIKAN}schedule/${day}`);
|
||||
let body = "";
|
||||
|
||||
switch (day) {
|
||||
case "monday":
|
||||
body = JSON.parse(data).monday;
|
||||
break;
|
||||
case "tuesday":
|
||||
body = JSON.parse(data).tuesday;
|
||||
break;
|
||||
case "wednesday":
|
||||
body = JSON.parse(data).wednesday;
|
||||
break;
|
||||
case "thursday":
|
||||
body = JSON.parse(data).thursday;
|
||||
break;
|
||||
case "friday":
|
||||
body = JSON.parse(data).friday;
|
||||
break;
|
||||
case "saturday":
|
||||
body = JSON.parse(data).saturday;
|
||||
break;
|
||||
case "sunday":
|
||||
body = JSON.parse(data).sunday;
|
||||
break;
|
||||
default:
|
||||
body = JSON.parse(data).monday;
|
||||
}
|
||||
|
||||
return Promise.all(body);
|
||||
|
||||
};
|
||||
|
||||
const top = async (type, subtype, page) =>{
|
||||
|
||||
const data = await cloudscraper.get(`${BASE_JIKAN}top/${type}/${page}/${subtype}`);
|
||||
let body = JSON.parse(data).top;
|
||||
|
||||
return Promise.all(body);
|
||||
|
||||
};
|
||||
|
||||
const getAllAnimes = async () =>{
|
||||
|
||||
const data = await cloudscraper.get(`${BASE_ANIMEFLV}api/animes/list`);
|
||||
let body = JSON.parse(data);
|
||||
|
||||
return Promise.all(body);
|
||||
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
schedule,
|
||||
top,
|
||||
getAllAnimes
|
||||
};
|
@ -0,0 +1,24 @@
|
||||
const express = require('express');
|
||||
const routes = require('./routes/index');
|
||||
|
||||
const router = express.Router();
|
||||
|
||||
router.get('/', (req, res) => {
|
||||
res.json({
|
||||
message: 'Aruppi API - 🎏',
|
||||
author: 'Jéluchu',
|
||||
version: '1.0.0',
|
||||
credits: 'The bitch loves APIs that offers data to Aruppi App',
|
||||
entries: [
|
||||
{
|
||||
'Schedule': '/api/v1/schedule/:id',
|
||||
'Top': '/top/:type/:subtype/:page',
|
||||
'GetAllAnimes': '/getAllAnimes'
|
||||
}
|
||||
]
|
||||
});
|
||||
});
|
||||
|
||||
router.use('/', routes);
|
||||
|
||||
module.exports = router;
|
@ -0,0 +1,50 @@
|
||||
const express = require('express');
|
||||
const router = express.Router();
|
||||
const api = require('../api');
|
||||
|
||||
router.get('/schedule/:day' , (req, res) =>{
|
||||
|
||||
let day = req.params.day;
|
||||
|
||||
api.schedule(day)
|
||||
.then(day =>{
|
||||
res.status(200).json({
|
||||
day
|
||||
});
|
||||
}).catch((err) =>{
|
||||
console.error(err);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
router.get('/top/:type/:subtype/:page' , (req, res) =>{
|
||||
|
||||
let type = req.params.type;
|
||||
let subtype = req.params.subtype;
|
||||
let page = req.params.page;
|
||||
|
||||
api.top(type, subtype, page)
|
||||
.then(top =>{
|
||||
res.status(200).json({
|
||||
top
|
||||
});
|
||||
}).catch((err) =>{
|
||||
console.error(err);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
router.get('/getAllAnimes' , (req, res) =>{
|
||||
|
||||
api.getAllAnimes()
|
||||
.then(animes =>{
|
||||
res.status(200).json({
|
||||
animes
|
||||
});
|
||||
}).catch((err) =>{
|
||||
console.error(err);
|
||||
});
|
||||
|
||||
});
|
||||
|
||||
module.exports = router;
|
@ -0,0 +1,10 @@
|
||||
module.exports = {
|
||||
BASE_ANIMEFLV: 'https://animeflv.net/',
|
||||
BASE_JIKAN: 'https://dev.aruppi.jeluchu.xyz/apis/jikan/v3/',
|
||||
BROWSE_URL: 'https://animeflv.net/browse?',
|
||||
SEARCH_URL: 'https://animeflv.net/browse?q=',
|
||||
ANIME_VIDEO_URL: 'https://animeflv.net/ver/',
|
||||
BASE_EPISODE_IMG_URL: 'https://cdn.animeflv.net/screenshots/',
|
||||
BASE_JIKA_URL: 'http://devel.jeluchu.xyz/apis/jikan/v3/search/anime?q=',
|
||||
BASE_MYANIME_LIST_URL : 'https://myanimelist.net/character/'
|
||||
};
|
@ -0,0 +1,29 @@
|
||||
const express = require('express');
|
||||
const morgan = require('morgan');
|
||||
const helmet = require('helmet');
|
||||
const cors = require('cors');
|
||||
const bodyParser = require('body-parser');
|
||||
|
||||
const middlewares = require('./middlewares/index').middleware;
|
||||
const api = require('./api');
|
||||
|
||||
const app = express();
|
||||
|
||||
app.use(morgan('dev'));
|
||||
app.use(helmet());
|
||||
app.use(cors());
|
||||
app.use(bodyParser.json());
|
||||
app.use(bodyParser.urlencoded({ extended: false }));
|
||||
|
||||
|
||||
app.get('/', (req, res) => {
|
||||
res.json({
|
||||
message: '🦄🌈✨👋🌎🌍🌏✨🌈🦄'
|
||||
});
|
||||
});
|
||||
|
||||
app.use('/api/v2', api);
|
||||
|
||||
app.use(middlewares);
|
||||
|
||||
module.exports = app;
|
@ -0,0 +1,8 @@
|
||||
const app = require('./app');
|
||||
const port = process.env.PORT || 5000;
|
||||
|
||||
app.listen(port, () => {
|
||||
/* eslint-disable no-console */
|
||||
console.log(`\n🚀 ... Listening: http://localhost:${port}`);
|
||||
/* eslint-enable no-console */
|
||||
});
|
@ -0,0 +1,12 @@
|
||||
const compose = require('compose-middleware').compose;
|
||||
const {errorHandler , notFound , requestLoggerMiddleware} = require('./middlewares');
|
||||
|
||||
const middleware = compose([
|
||||
notFound,
|
||||
errorHandler,
|
||||
requestLoggerMiddleware
|
||||
]);
|
||||
|
||||
module.exports = {
|
||||
middleware
|
||||
};
|
@ -0,0 +1,32 @@
|
||||
const notFound = (req, res, next) => {
|
||||
res.status(404);
|
||||
const error = new Error(`🔍 - Not Found - ${req.originalUrl}`);
|
||||
next(error);
|
||||
};
|
||||
|
||||
/* eslint-disable no-unused-vars */
|
||||
const errorHandler = (err, req, res, next) => {
|
||||
/* eslint-enable no-unused-vars */
|
||||
const statusCode = res.statusCode !== 200 ? res.statusCode : 500;
|
||||
res.status(statusCode);
|
||||
res.json({
|
||||
message: err.message,
|
||||
stack: process.env.NODE_ENV === 'production' ? '🥞' : err.stack
|
||||
});
|
||||
};
|
||||
|
||||
const requestLoggerMiddleware = (req, res, next) => {
|
||||
console.log(`${req.method} ${req.originalUrl}`);
|
||||
const start = new Date().getTime();
|
||||
res.on('finish', () => {
|
||||
const elapsed = new Date().getTime() - start;
|
||||
console.info(`${req.method} ${req.originalUrl} ${req.statusCode} ${elapsed}ms`);
|
||||
});
|
||||
next();
|
||||
};
|
||||
|
||||
module.exports = {
|
||||
notFound,
|
||||
errorHandler,
|
||||
requestLoggerMiddleware
|
||||
};
|
@ -0,0 +1,46 @@
|
||||
const cloudscraper = require('cloudscraper')
|
||||
const imageToBase64 = require("image-to-base64");
|
||||
|
||||
const MergeRecursive = (obj1 , obj2) => {
|
||||
for(var p in obj2) {
|
||||
try{
|
||||
// Property in destination object set; update its value.
|
||||
if(obj2[p].constructor == Object){
|
||||
obj1[p] = MergeRecursive(obj1[p], obj2[p]);
|
||||
}else{
|
||||
obj1[p] = obj2[p];
|
||||
}
|
||||
}catch(e){
|
||||
// Property in destination object not set; create it and set its value.
|
||||
obj1[p] = obj2[p];
|
||||
}
|
||||
}
|
||||
return obj1;
|
||||
}
|
||||
|
||||
const imageUrlToBase64 = async(url) => {
|
||||
let res = await cloudscraper({
|
||||
url,
|
||||
method: "GET",
|
||||
encoding: null
|
||||
});
|
||||
|
||||
return Buffer.from(res).toString("base64");
|
||||
};
|
||||
|
||||
const urlify = async(text) =>{
|
||||
const urls = [];
|
||||
const urlRegex = /(https?:\/\/[^\s]+)/g;
|
||||
text.replace(urlRegex , (url) =>{
|
||||
urls.push(url)
|
||||
});
|
||||
return Promise.all(urls);
|
||||
};
|
||||
|
||||
|
||||
module.exports = {
|
||||
MergeRecursive,
|
||||
imageUrlToBase64,
|
||||
urlify,
|
||||
decodeZippyURL
|
||||
}
|
Loading…
Reference in New Issue