organo 0.3.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- checksums.yaml +7 -0
- data/Gemfile +6 -0
- data/LICENSE.txt +21 -0
- data/README.md +7 -0
- data/exe/organo +6 -0
- data/lib/organo/commands/anime/anime_add.rb +35 -0
- data/lib/organo/commands/anime/anime_add_sequel.rb +43 -0
- data/lib/organo/commands/anime/anime_get_broken_links.rb +30 -0
- data/lib/organo/commands/anime/anime_remove.rb +29 -0
- data/lib/organo/commands/anime/anime_search.rb +26 -0
- data/lib/organo/commands/anime/anime_show.rb +26 -0
- data/lib/organo/commands/anime/anime_update_image.rb +36 -0
- data/lib/organo/commands/anime/anime_update_query.rb +33 -0
- data/lib/organo/commands/api/api_get_anime.rb +25 -0
- data/lib/organo/commands/api/api_get_season.rb +26 -0
- data/lib/organo/commands/api/api_get_sequels.rb +24 -0
- data/lib/organo/commands/api/api_search_anime.rb +27 -0
- data/lib/organo/commands/init.rb +22 -0
- data/lib/organo/commands/merge.rb +20 -0
- data/lib/organo/commands/remote/remote_add.rb +38 -0
- data/lib/organo/commands/remote/remote_download.rb +41 -0
- data/lib/organo/commands/remote/remote_remove.rb +34 -0
- data/lib/organo/commands/remote/remote_upload.rb +43 -0
- data/lib/organo/commands/schedule/schedule_create.rb +27 -0
- data/lib/organo/commands/statistics.rb +26 -0
- data/lib/organo/commands/version.rb +15 -0
- data/lib/organo/config.rb +6 -0
- data/lib/organo/jikan_api.rb +11 -0
- data/lib/organo/query.rb +30 -0
- data/lib/organo/reader.rb +38 -0
- data/lib/organo/request.rb +13 -0
- data/lib/organo/search_show.rb +58 -0
- data/lib/organo/sequel.rb +39 -0
- data/lib/organo/show.rb +36 -0
- data/lib/organo/show_list.rb +32 -0
- data/lib/organo/version.rb +5 -0
- data/lib/organo/writer.rb +16 -0
- data/lib/organo.rb +61 -0
- metadata +141 -0
checksums.yaml
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
---
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: 07f88d3bafa6f79b66260174f984f415229f6f449da715b010df238d201c1eab
|
4
|
+
data.tar.gz: 77efeae28ceefe926c10be6e6789ca5158fc49e1c405ea88c37932a087c40a5b
|
5
|
+
SHA512:
|
6
|
+
metadata.gz: f9cfb0f392479f25a6713525966805c30fd455403e2079f479337050b8722c2f9c5ddd294cbfab4992e20a691b3f09ef3695715feefa6b3fd9efa857f5bcbd87
|
7
|
+
data.tar.gz: 637433a7ad969aeaab7cace448cea1b1a2b74a60891c384c8ab8ed2f48b0c46ec4506b0c003352c68b168d33a004b13f5da874800883958b824488f2b2291c0a
|
data/Gemfile
ADDED
data/LICENSE.txt
ADDED
@@ -0,0 +1,21 @@
|
|
1
|
+
The MIT License (MIT)
|
2
|
+
|
3
|
+
Copyright (c) 2023 Louis-Philippe Fortin
|
4
|
+
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
7
|
+
in the Software without restriction, including without limitation the rights
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
10
|
+
furnished to do so, subject to the following conditions:
|
11
|
+
|
12
|
+
The above copyright notice and this permission notice shall be included in
|
13
|
+
all copies or substantial portions of the Software.
|
14
|
+
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
21
|
+
THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,7 @@
|
|
1
|
+
# Organo
|
2
|
+
|
3
|
+
Organo is named after the mafia group that runs the city of Lux in the anime [Texhnolyze](https://myanimelist.net/anime/26/Texhnolyze).
|
4
|
+
|
5
|
+
This tool has been made to manage data that is shown on the DKB Anime Community website. It uses to the [JikanAPI](https://jikan.moe), an unofficial MyAnimeList API, to get data.
|
6
|
+
|
7
|
+
**This tool is still under construction. Documentation is coming soon.**
|
data/exe/organo
ADDED
@@ -0,0 +1,35 @@
|
|
1
|
+
require_relative '../../config'
|
2
|
+
require_relative '../../writer'
|
3
|
+
require_relative '../../reader'
|
4
|
+
|
5
|
+
module Organo
|
6
|
+
module CLI
|
7
|
+
module Commands
|
8
|
+
module Anime
|
9
|
+
module Add
|
10
|
+
|
11
|
+
class AnimeEntry < Dry::CLI::Command
|
12
|
+
desc "Add anime entry to files"
|
13
|
+
argument :mal_id, type: :integer, required: true, desc: "MyAnimeList ID"
|
14
|
+
|
15
|
+
def call(mal_id:, **)
|
16
|
+
json_obj = Query.get_anime_by_id(mal_id)
|
17
|
+
show = SearchShow.new(json_obj['mal_id'], json_obj['title'], json_obj['images']['jpg']['image_url'])
|
18
|
+
show_type = json_obj['type']
|
19
|
+
file_name = (show_type == 'TV' ? "#{json_obj['year']}-#{json_obj['season']}" : show_type.downcase)
|
20
|
+
file_path = "#{Config::DEFAULT_DIR}/#{file_name}.json"
|
21
|
+
show_list = File.exist?(file_path) ? Reader.read_file(file_path) : Array.new
|
22
|
+
if (show_list.find_index { |s| s.id.to_s == mal_id.to_s }.nil?)
|
23
|
+
Writer.to_file(show_list.push(show).sort_by(&:title), file_path)
|
24
|
+
puts "Added anime \"#{show.title}\" (#{mal_id})"
|
25
|
+
else
|
26
|
+
puts 'Cannot add an already existing anime'
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require_relative '../../config'
|
2
|
+
require_relative '../../writer'
|
3
|
+
require_relative '../../reader'
|
4
|
+
|
5
|
+
module Organo
|
6
|
+
module CLI
|
7
|
+
module Commands
|
8
|
+
module Anime
|
9
|
+
module Add
|
10
|
+
|
11
|
+
class SequelEntry < Dry::CLI::Command
|
12
|
+
desc 'Add anime entry to files'
|
13
|
+
argument :anime_mal_id, type: :integer, required: true, desc: 'Anime MyAnimeList ID'
|
14
|
+
argument :sequel_mal_id, type: :integer, required: true, desc: 'Sequel MyAnimeList ID'
|
15
|
+
argument :season_num, type: :integer, required: false, default: 0, desc: 'Season number'
|
16
|
+
argument :type, type: :string, required: false, default: '', values: %w[part movie special], desc: 'Type of sequel (part, movie, special)'
|
17
|
+
argument :type_num, type: :integer, required: false, default: 0, desc: 'The sequel type number'
|
18
|
+
|
19
|
+
def call(anime_mal_id:, sequel_mal_id:, season_num:, type:, type_num:, **)
|
20
|
+
json_obj = Query.get_anime_by_id(sequel_mal_id)
|
21
|
+
Dir["#{Config::DEFAULT_DIR}/*.json"].each do |file_path|
|
22
|
+
shows_list = Reader.read_file(file_path)
|
23
|
+
show = shows_list.find { |s| s.id.to_s == anime_mal_id.to_s }
|
24
|
+
next if show.nil?
|
25
|
+
|
26
|
+
unless show.sequels.find { |s| s['id'].to_s == sequel_mal_id.to_s }
|
27
|
+
sequel = Sequel.new(json_obj['mal_id'], json_obj['title'], json_obj['images']['jpg']['image_url'], season_num, type, type_num)
|
28
|
+
show.sequels.push(sequel)
|
29
|
+
Writer.to_file(shows_list, file_path)
|
30
|
+
puts "Added sequel \"#{sequel.title}\" (#{sequel.id}) to anime."
|
31
|
+
else
|
32
|
+
puts 'Cannot add an already existing sequel.'
|
33
|
+
end
|
34
|
+
break
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'httparty'
|
2
|
+
require_relative '../../reader'
|
3
|
+
|
4
|
+
module Organo
|
5
|
+
module CLI
|
6
|
+
module Commands
|
7
|
+
module Anime
|
8
|
+
module Get
|
9
|
+
|
10
|
+
class BrokenLinks < Dry::CLI::Command
|
11
|
+
desc "Get list of anime IDs that have broken links"
|
12
|
+
|
13
|
+
def call(*)
|
14
|
+
show_list = Reader.read_all_files
|
15
|
+
broken_list = Array.new
|
16
|
+
show_list.each do |show|
|
17
|
+
response = HTTParty.get(show.image_url)
|
18
|
+
next unless response.code == 404
|
19
|
+
|
20
|
+
broken_list.push(show.id)
|
21
|
+
end
|
22
|
+
puts broken_list.join(' ') unless broken_list.empty?
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
require_relative '../../config'
|
2
|
+
|
3
|
+
module Organo
|
4
|
+
module CLI
|
5
|
+
module Commands
|
6
|
+
module Anime
|
7
|
+
|
8
|
+
class Remove < Dry::CLI::Command
|
9
|
+
desc "Remove anime entry from files"
|
10
|
+
argument :mal_id, type: :integer, required: true, desc: "MyAnimeList ID"
|
11
|
+
|
12
|
+
def call(mal_id:, **)
|
13
|
+
Dir["#{Config::DEFAULT_DIR}/*.json"].each do |file_path|
|
14
|
+
shows_list = Reader.read_file(file_path)
|
15
|
+
show_index = shows_list.find_index { |s| s.id.to_s == mal_id.to_s }
|
16
|
+
if show_index >= 0
|
17
|
+
show = shows_list.delete_at(show_index)
|
18
|
+
Writer.to_file(shows_list, file_path)
|
19
|
+
puts "Removed anime \"#{show.title}\" (#{mal_id})"
|
20
|
+
break
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../../config'
|
2
|
+
|
3
|
+
module Organo
|
4
|
+
module CLI
|
5
|
+
module Commands
|
6
|
+
module Anime
|
7
|
+
|
8
|
+
class Search < Dry::CLI::Command
|
9
|
+
desc "Search anime by query from files"
|
10
|
+
argument :query, type: :string, required: true, desc: "Search query"
|
11
|
+
|
12
|
+
def call(query:, **)
|
13
|
+
found_list = Array.new
|
14
|
+
Dir["#{Config::DEFAULT_DIR}/*.json"].each do |file_path|
|
15
|
+
shows_list = Reader.read_file(file_path)
|
16
|
+
show = shows_list.find { |s| s.title.downcase.include? query }
|
17
|
+
found_list.push(show) unless show.nil?
|
18
|
+
end
|
19
|
+
puts found_list.to_json
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../../config'
|
2
|
+
|
3
|
+
module Organo
|
4
|
+
module CLI
|
5
|
+
module Commands
|
6
|
+
module Anime
|
7
|
+
|
8
|
+
class Show < Dry::CLI::Command
|
9
|
+
desc "Show anime entry from files"
|
10
|
+
argument :mal_id, type: :integer, required: true, desc: "MyAnimeList ID"
|
11
|
+
|
12
|
+
def call(mal_id:, **)
|
13
|
+
Dir["#{Config::DEFAULT_DIR}/*.json"].each do |file_path|
|
14
|
+
shows_list = Reader.read_file(file_path)
|
15
|
+
show = shows_list.find { |s| s.id.to_s == mal_id.to_s }
|
16
|
+
next if show.nil?
|
17
|
+
|
18
|
+
puts show.to_json
|
19
|
+
end
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
require_relative '../../config'
|
2
|
+
require_relative '../../query'
|
3
|
+
require_relative '../../writer'
|
4
|
+
require_relative '../../reader'
|
5
|
+
|
6
|
+
module Organo
|
7
|
+
module CLI
|
8
|
+
module Commands
|
9
|
+
module Anime
|
10
|
+
module Update
|
11
|
+
|
12
|
+
class Image < Dry::CLI::Command
|
13
|
+
desc "Update cover image for the specified anime"
|
14
|
+
argument :mal_id_list, type: :array, required: true, desc: "MyAnimeList ID list"
|
15
|
+
|
16
|
+
def call(mal_id_list:, **)
|
17
|
+
Dir["#{Config::DEFAULT_DIR}/*.json"].each do |file_path|
|
18
|
+
shows_list = Reader.read_file(file_path)
|
19
|
+
mal_id_list.each do |mal_id|
|
20
|
+
show = shows_list.find { |s| s.id.to_s == mal_id.to_s }
|
21
|
+
next if show.nil?
|
22
|
+
|
23
|
+
show.image_url = Query.get_anime_image(show.id)
|
24
|
+
Writer.to_file(shows_list, file_path)
|
25
|
+
# puts show.image_url
|
26
|
+
end
|
27
|
+
end
|
28
|
+
puts 'Cover image(s) has been updated.'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
require_relative '../../config'
|
2
|
+
require_relative '../../writer'
|
3
|
+
require_relative '../../reader'
|
4
|
+
|
5
|
+
module Organo
|
6
|
+
module CLI
|
7
|
+
module Commands
|
8
|
+
module Anime
|
9
|
+
module Update
|
10
|
+
|
11
|
+
class SearchQuery < Dry::CLI::Command
|
12
|
+
desc "Update search query for the specified anime"
|
13
|
+
argument :mal_id, type: :integer, required: true, desc: "MyAnimeList ID"
|
14
|
+
argument :search_query, type: :string, required: true, desc: "String query for Nyaa Torrents search"
|
15
|
+
|
16
|
+
def call(mal_id:, search_query:, **)
|
17
|
+
Dir["#{Config::DEFAULT_DIR}/*.json"].each do |file_path|
|
18
|
+
shows_list = Reader.read_file(file_path)
|
19
|
+
show = shows_list.find { |s| s.id.to_s == mal_id.to_s }
|
20
|
+
next if show.nil?
|
21
|
+
|
22
|
+
show.search_query = search_query
|
23
|
+
Writer.to_file(shows_list, file_path)
|
24
|
+
puts "Search query has been updated."
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
require_relative '../../query'
|
2
|
+
require_relative '../../show_list'
|
3
|
+
|
4
|
+
module Organo
|
5
|
+
module CLI
|
6
|
+
module Commands
|
7
|
+
module API
|
8
|
+
module Get
|
9
|
+
|
10
|
+
class Anime < Dry::CLI::Command
|
11
|
+
desc "Get anime with specific ID from API"
|
12
|
+
argument :mal_id, type: :integer, required: true, desc: "MyAnimeList ID"
|
13
|
+
|
14
|
+
def call(mal_id:, **)
|
15
|
+
json_obj = Query.get_anime_by_id(mal_id)
|
16
|
+
show = SearchShow.new(json_obj['mal_id'], json_obj['title'], json_obj['images']['jpg']['image_url'])
|
17
|
+
puts show.to_json
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../../query'
|
2
|
+
require_relative '../../show_list'
|
3
|
+
|
4
|
+
module Organo
|
5
|
+
module CLI
|
6
|
+
module Commands
|
7
|
+
module API
|
8
|
+
module Get
|
9
|
+
|
10
|
+
class Season < Dry::CLI::Command
|
11
|
+
desc "Get list of anime for a specific season"
|
12
|
+
argument :season, type: :string, required: true, desc: "Winter, Spring, Summer or Fall"
|
13
|
+
argument :year, type: :integer, required: true, desc: "Year"
|
14
|
+
|
15
|
+
def call(season:, year:, **)
|
16
|
+
json_obj = Query.get_anime_season(season, year)
|
17
|
+
show_list = ShowList.create_search_show_list(json_obj)
|
18
|
+
puts show_list.to_json
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
@@ -0,0 +1,24 @@
|
|
1
|
+
require_relative '../../query'
|
2
|
+
require_relative '../../show_list'
|
3
|
+
|
4
|
+
module Organo
|
5
|
+
module CLI
|
6
|
+
module Commands
|
7
|
+
module API
|
8
|
+
module Get
|
9
|
+
|
10
|
+
class Sequels < Dry::CLI::Command
|
11
|
+
desc "Get list of sequels for a specific anime"
|
12
|
+
argument :mal_id, type: :integer, required: true, desc: "MyAnimeList ID"
|
13
|
+
|
14
|
+
def call(mal_id:, **)
|
15
|
+
sequels = ShowList.create_search_sequel_list(Query.get_anime_sequel(mal_id))
|
16
|
+
puts sequels.to_json
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require_relative '../../query'
|
2
|
+
require_relative '../../show_list'
|
3
|
+
|
4
|
+
module Organo
|
5
|
+
module CLI
|
6
|
+
module Commands
|
7
|
+
module API
|
8
|
+
module Search
|
9
|
+
|
10
|
+
class Anime < Dry::CLI::Command
|
11
|
+
desc "Get a list anime from query"
|
12
|
+
argument :query, type: :string, required: true, desc: "Search query"
|
13
|
+
option :type, type: :string, required: false, default: '', values: %w[tv movie ova special ona music], desc: "Type of anime"
|
14
|
+
option :limit, type: :integer, required: false, default: 5, desc: "Limit number of results"
|
15
|
+
|
16
|
+
def call(query:, type:, limit:, **)
|
17
|
+
json_obj = Query.search_anime(query, { 'type' => type, 'limit' => limit})
|
18
|
+
show_list = ShowList.create_search_show_list(json_obj)
|
19
|
+
puts show_list.to_json
|
20
|
+
end
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,22 @@
|
|
1
|
+
module Organo
|
2
|
+
module CLI
|
3
|
+
module Commands
|
4
|
+
|
5
|
+
class Init < Dry::CLI::Command
|
6
|
+
desc "Initialize directory with default files and directories"
|
7
|
+
|
8
|
+
def call(*)
|
9
|
+
Dir.mkdir './.organo' unless File.exist?('./.organo')
|
10
|
+
Dir.mkdir './.organo/datafiles' unless File.exist?('./.organo/datafiles')
|
11
|
+
File.write(
|
12
|
+
'./shows.config.json',
|
13
|
+
'{"last_id":0,"schema":{"id":"integer","slug":"string","title":"string",' \
|
14
|
+
'"image_url":"string","sequels":"string","search_query":"string"}}'
|
15
|
+
)
|
16
|
+
puts 'Initialized organo directory'
|
17
|
+
end
|
18
|
+
end
|
19
|
+
|
20
|
+
end
|
21
|
+
end
|
22
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
require_relative '../reader'
|
2
|
+
require_relative '../writer'
|
3
|
+
|
4
|
+
module Organo
|
5
|
+
module CLI
|
6
|
+
module Commands
|
7
|
+
|
8
|
+
class Merge < Dry::CLI::Command
|
9
|
+
desc "Merge edited seasonal files into one main file"
|
10
|
+
|
11
|
+
def call(*)
|
12
|
+
show_list = Reader.read_all_files
|
13
|
+
Writer.to_data_file(show_list, 'shows')
|
14
|
+
puts 'Edited files have been merged.'
|
15
|
+
end
|
16
|
+
end
|
17
|
+
|
18
|
+
end
|
19
|
+
end
|
20
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
require_relative '../../config'
|
2
|
+
|
3
|
+
module Organo
|
4
|
+
module CLI
|
5
|
+
module Commands
|
6
|
+
module Remote
|
7
|
+
|
8
|
+
class Add < Dry::CLI::Command
|
9
|
+
desc "Add remote FTP server to config file"
|
10
|
+
argument :env, type: :string, required: true, desc: "Remote environment name"
|
11
|
+
argument :url, type: :string, required: true, desc: "FTP server url"
|
12
|
+
option :username, type: :string, default: '', desc: "FTP account username"
|
13
|
+
option :password, type: :string, default: '', desc: "FTP account password"
|
14
|
+
option :directory, type: :string, default: '', desc: "FTP directory"
|
15
|
+
|
16
|
+
def call(env:, url:, username:, password:, directory:, **)
|
17
|
+
config = File.exist?(Config::DEFAULT_FILE) ? JSON.parse(File.read(Config::DEFAULT_FILE)) : Array.new
|
18
|
+
section = config.find { |option| option['section'] == 'remotes' }
|
19
|
+
remote = { env: env, url: url, username: username, password: password, directory: directory }
|
20
|
+
if section.nil?
|
21
|
+
section = { section: 'remotes', entries: []}
|
22
|
+
config.push(section)
|
23
|
+
section[:entries].push(remote)
|
24
|
+
else
|
25
|
+
if section['entries'].find { |entry| entry['env'] == env }.nil?
|
26
|
+
section['entries'].push(remote)
|
27
|
+
else
|
28
|
+
puts 'Environment name is already used'
|
29
|
+
end
|
30
|
+
end
|
31
|
+
File.write(Config::DEFAULT_FILE, JSON.pretty_generate(config))
|
32
|
+
end
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
|
3
|
+
module Organo
|
4
|
+
module CLI
|
5
|
+
module Commands
|
6
|
+
module Remote
|
7
|
+
|
8
|
+
class Download < Dry::CLI::Command
|
9
|
+
desc "Download data from website"
|
10
|
+
argument :env, type: :string, required: true, desc: "Environment"
|
11
|
+
|
12
|
+
def call(env:, **)
|
13
|
+
config = File.exist?(Config::DEFAULT_FILE) ? JSON.parse(File.read(Config::DEFAULT_FILE)) : nil
|
14
|
+
section = config.find { |option| option['section'] == 'remotes' }
|
15
|
+
if section.nil?
|
16
|
+
puts "No remote is configured in the configuration file"
|
17
|
+
else
|
18
|
+
credentials = section['entries'].find { |entry| entry['env'] == env }
|
19
|
+
if credentials.nil?
|
20
|
+
puts 'Could not find the specified environment'
|
21
|
+
else
|
22
|
+
Net::FTP.open(credentials['url']) do |ftp|
|
23
|
+
ftp.login(credentials['username'], credentials['password'])
|
24
|
+
ftp.chdir(credentials['directory'])
|
25
|
+
if File.exist?('shows.data.json')
|
26
|
+
File.delete('shows.data.json.old') if File.exist?('shows.data.json.old')
|
27
|
+
File.rename('shows.data.json', 'shows.data.json.old')
|
28
|
+
end
|
29
|
+
ftp.getbinaryfile('shows.data.json')
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
rescue Net::FTPPermError
|
34
|
+
puts 'Login to FTP server failed.'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,34 @@
|
|
1
|
+
require_relative '../../config'
|
2
|
+
|
3
|
+
module Organo
|
4
|
+
module CLI
|
5
|
+
module Commands
|
6
|
+
module Remote
|
7
|
+
|
8
|
+
class Remove < Dry::CLI::Command
|
9
|
+
desc "Remove remote FTP server from config file"
|
10
|
+
argument :env, type: :string, required: true, desc: "Remote environment name"
|
11
|
+
|
12
|
+
def call(env:, **)
|
13
|
+
config = File.exist?(Config::DEFAULT_FILE) ? JSON.parse(File.read(Config::DEFAULT_FILE)) : nil
|
14
|
+
unless config.nil?
|
15
|
+
section = config.find { |option| option['section'] == 'remotes' }
|
16
|
+
unless section.nil?
|
17
|
+
index = section['entries'].find_index { |entry| entry['env'] == env }
|
18
|
+
if index.nil?
|
19
|
+
puts "Specified environment does not exist"
|
20
|
+
elsif !section['entries'].delete_at(index).nil?
|
21
|
+
puts "Removed \"#{env}\" entry"
|
22
|
+
end
|
23
|
+
else
|
24
|
+
puts 'Configuration file does not have a remote'
|
25
|
+
end
|
26
|
+
end
|
27
|
+
File.write(Config::DEFAULT_FILE, JSON.pretty_generate(config))
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
@@ -0,0 +1,43 @@
|
|
1
|
+
require 'net/ftp'
|
2
|
+
|
3
|
+
module Organo
|
4
|
+
module CLI
|
5
|
+
module Commands
|
6
|
+
module Remote
|
7
|
+
|
8
|
+
class Upload < Dry::CLI::Command
|
9
|
+
desc "Upload data to the website FTP"
|
10
|
+
argument :env, type: :string, required: true, desc: "Environment"
|
11
|
+
|
12
|
+
def call(env:, **)
|
13
|
+
config = File.exist?(Config::DEFAULT_FILE) ? JSON.parse(File.read(Config::DEFAULT_FILE)) : nil
|
14
|
+
section = config.find { |option| option['section'] == 'remotes' }
|
15
|
+
if section.nil?
|
16
|
+
puts "No remote is configured in the configuration file"
|
17
|
+
else
|
18
|
+
credentials = section['entries'].find { |entry| entry['env'] == env }
|
19
|
+
if credentials.nil?
|
20
|
+
puts 'Could not find the specified environment'
|
21
|
+
else
|
22
|
+
local_files = Dir['./*.{data,config}.json']
|
23
|
+
local_files.push('./schedule.json')
|
24
|
+
Net::FTP.open(credentials['url']) do |ftp|
|
25
|
+
ftp.login(credentials['username'], credentials['password'])
|
26
|
+
ftp.chdir(credentials['directory'])
|
27
|
+
local_files.each do |file_path|
|
28
|
+
file_name = File.basename(file_path)
|
29
|
+
puts "Uploading file: #{file_name}"
|
30
|
+
ftp.putbinaryfile(file_name)
|
31
|
+
end
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
rescue Net::FTPPermError
|
36
|
+
puts 'Login to FTP server failed.'
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
end
|
41
|
+
end
|
42
|
+
end
|
43
|
+
end
|
@@ -0,0 +1,27 @@
|
|
1
|
+
require 'date'
|
2
|
+
|
3
|
+
module Organo
|
4
|
+
module CLI
|
5
|
+
module Commands
|
6
|
+
module Schedule
|
7
|
+
|
8
|
+
class Create < Dry::CLI::Command
|
9
|
+
desc "Initialize directory with default files and directories"
|
10
|
+
|
11
|
+
def call(*)
|
12
|
+
content = Array.new
|
13
|
+
Date::DAYNAMES.each do |dname|
|
14
|
+
content.push({ 'weekday' => dname.downcase, 'shows' => [] } )
|
15
|
+
end
|
16
|
+
File.write(
|
17
|
+
'./schedule.json',
|
18
|
+
JSON.pretty_generate(content)
|
19
|
+
)
|
20
|
+
puts 'Created the schedule'
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
require_relative '../reader'
|
2
|
+
|
3
|
+
module Organo
|
4
|
+
module CLI
|
5
|
+
module Commands
|
6
|
+
|
7
|
+
class Statistics < Dry::CLI::Command
|
8
|
+
desc "Merge edited seasonal files into one main file"
|
9
|
+
|
10
|
+
def call(*)
|
11
|
+
i = 0
|
12
|
+
total_size = 0
|
13
|
+
Dir["#{Config::DEFAULT_DIR}/*.json"].each do |file_path|
|
14
|
+
shows = Reader.read_file(file_path)
|
15
|
+
file_size = File.size(file_path)
|
16
|
+
puts "#{File.basename(file_path)}: #{shows.count} (#{file_size} b)"
|
17
|
+
i += shows.count
|
18
|
+
total_size += file_size
|
19
|
+
end
|
20
|
+
puts "Total count: #{i} (#{total_size} o)"
|
21
|
+
end
|
22
|
+
end
|
23
|
+
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
data/lib/organo/query.rb
ADDED
@@ -0,0 +1,30 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require_relative 'jikan_api'
|
4
|
+
require_relative 'request'
|
5
|
+
require_relative 'search_show'
|
6
|
+
|
7
|
+
module Organo
|
8
|
+
class Query
|
9
|
+
def self.get_anime_by_id(mal_id)
|
10
|
+
Request.get_json("#{JikanAPI.get_url('anime')}/#{mal_id}")
|
11
|
+
end
|
12
|
+
|
13
|
+
def self.search_anime(query, options)
|
14
|
+
form = URI.encode_www_form('q' => query, 'type' => options['type'], 'limit' => options['limit'])
|
15
|
+
Request.get_json("#{JikanAPI.get_url('anime')}?#{form}")
|
16
|
+
end
|
17
|
+
|
18
|
+
def self.get_anime_season(season, year)
|
19
|
+
Request.get_json("#{JikanAPI.get_url('seasons')}/#{year}/#{season.downcase}")
|
20
|
+
end
|
21
|
+
|
22
|
+
def self.get_anime_image(mal_id)
|
23
|
+
Request.get_json("#{JikanAPI.get_url('anime')}/#{mal_id}")['images']['jpg']['image_url']
|
24
|
+
end
|
25
|
+
|
26
|
+
def self.get_anime_sequel(mal_id)
|
27
|
+
Request.get_json("#{JikanAPI.get_url('anime')}/#{mal_id}/relations")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,38 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require_relative 'config'
|
5
|
+
require_relative 'show'
|
6
|
+
|
7
|
+
module Organo
|
8
|
+
class Reader
|
9
|
+
def self.read_all_files
|
10
|
+
shows = []
|
11
|
+
Dir["#{Config::DEFAULT_DIR}/*.json"].each do |file_path|
|
12
|
+
shows = shows.union(Reader.read_file(file_path))
|
13
|
+
end
|
14
|
+
shows.sort_by(&:title)
|
15
|
+
end
|
16
|
+
|
17
|
+
def self.read_file(file_path)
|
18
|
+
shows = []
|
19
|
+
file = File.read(file_path)
|
20
|
+
data = JSON.parse(file)
|
21
|
+
data.each do |show|
|
22
|
+
shows.push(
|
23
|
+
Show.new(
|
24
|
+
show['id'],
|
25
|
+
show['slug'],
|
26
|
+
show['title'],
|
27
|
+
show['image_url'],
|
28
|
+
show['search_query'],
|
29
|
+
show['links'],
|
30
|
+
show['sequels']
|
31
|
+
)
|
32
|
+
)
|
33
|
+
end
|
34
|
+
shows
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
end
|
@@ -0,0 +1,58 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Organo
|
6
|
+
class SearchShow
|
7
|
+
attr_accessor :id, :title, :image_url, :search_query
|
8
|
+
|
9
|
+
def initialize(id, title, image_url)
|
10
|
+
@id = id
|
11
|
+
@slug = create_slug(title)
|
12
|
+
@title = title.to_s
|
13
|
+
@image_url = image_url
|
14
|
+
@search_query = title
|
15
|
+
end
|
16
|
+
|
17
|
+
def create_slug(title)
|
18
|
+
# strip the string
|
19
|
+
ret = title.strip
|
20
|
+
|
21
|
+
# blow away apostrophes
|
22
|
+
ret.gsub!(/['`]/, '')
|
23
|
+
|
24
|
+
# @ --> at, and & --> and
|
25
|
+
ret.gsub!(/\s*@\s*/, ' at ')
|
26
|
+
ret.gsub!(/\s*&\s*/, ' and ')
|
27
|
+
|
28
|
+
# replace all non alphanumeric with dash
|
29
|
+
ret.gsub!(/\s*[^A-Za-z0-9]\s*/, '-')
|
30
|
+
|
31
|
+
# convert double underscores to single
|
32
|
+
ret.gsub!(/-+/, '-')
|
33
|
+
|
34
|
+
# strip off leading/trailing dash
|
35
|
+
ret.gsub!(/\A-+|-+\z/, '')
|
36
|
+
|
37
|
+
ret.downcase
|
38
|
+
end
|
39
|
+
|
40
|
+
def to_s
|
41
|
+
"title: #{@title}, synopsis: #{@description}, image_url: #{@image_url}"
|
42
|
+
end
|
43
|
+
|
44
|
+
def as_json(_options = {})
|
45
|
+
{
|
46
|
+
id: @id,
|
47
|
+
slug: @slug,
|
48
|
+
title: @title,
|
49
|
+
image_url: @image_url,
|
50
|
+
search_query: @search_query
|
51
|
+
}
|
52
|
+
end
|
53
|
+
|
54
|
+
def to_json(*options)
|
55
|
+
as_json(*options).to_json(*options)
|
56
|
+
end
|
57
|
+
end
|
58
|
+
end
|
@@ -0,0 +1,39 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Organo
|
6
|
+
class Sequel
|
7
|
+
attr_accessor :id, :type, :title, :image_url, :selector
|
8
|
+
|
9
|
+
def initialize(id, title, image_url, season_num = 0, type = "", type_num = 0, selector = -1)
|
10
|
+
@id = id
|
11
|
+
@title = title.to_s
|
12
|
+
@image_url = image_url
|
13
|
+
@season_num = season_num
|
14
|
+
@type = type.to_s
|
15
|
+
@type_num = type_num
|
16
|
+
@selector = selector
|
17
|
+
end
|
18
|
+
|
19
|
+
def to_s
|
20
|
+
"id: #{@id}, title: #{@title}, image_url: #{@image_url}"
|
21
|
+
end
|
22
|
+
|
23
|
+
def as_json(_options = {})
|
24
|
+
{
|
25
|
+
id: @id,
|
26
|
+
title: @title,
|
27
|
+
image_url: @image_url,
|
28
|
+
season_num: @season_num.to_i,
|
29
|
+
type: @type,
|
30
|
+
type_num: @type_num.to_i,
|
31
|
+
selector: @selector.to_i
|
32
|
+
}
|
33
|
+
end
|
34
|
+
|
35
|
+
def to_json(*options)
|
36
|
+
as_json(*options).to_json(*options)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
data/lib/organo/show.rb
ADDED
@@ -0,0 +1,36 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
class Show
|
6
|
+
attr_accessor :id, :slug, :title, :image_url, :search_query, :sequels
|
7
|
+
|
8
|
+
def initialize(id, slug, title, image_url, search_query, links = [], sequels = [])
|
9
|
+
@id = id
|
10
|
+
@slug = slug
|
11
|
+
@title = title.to_s
|
12
|
+
@image_url = image_url
|
13
|
+
@search_query = search_query.empty? ? title : search_query
|
14
|
+
@links = links.nil? ? [] : links
|
15
|
+
@sequels = sequels.nil? ? [] : sequels
|
16
|
+
end
|
17
|
+
|
18
|
+
def to_s
|
19
|
+
"id: #{@id}, title: #{@title}, image_url: #{@image_url}"
|
20
|
+
end
|
21
|
+
|
22
|
+
def as_json(_options = {})
|
23
|
+
{
|
24
|
+
id: @id,
|
25
|
+
slug: @slug,
|
26
|
+
title: @title,
|
27
|
+
image_url: @image_url,
|
28
|
+
sequels: @sequels,
|
29
|
+
search_query: @search_query
|
30
|
+
}
|
31
|
+
end
|
32
|
+
|
33
|
+
def to_json(*options)
|
34
|
+
as_json(*options).to_json(*options)
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,32 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
require_relative 'search_show'
|
5
|
+
require_relative 'sequel'
|
6
|
+
require_relative 'query'
|
7
|
+
|
8
|
+
module Organo
|
9
|
+
class ShowList
|
10
|
+
def self.create_search_show_list(json_obj)
|
11
|
+
show_list = []
|
12
|
+
json_obj.each do |entry|
|
13
|
+
show = SearchShow.new(entry['mal_id'], entry['title'], entry['images']['jpg']['image_url'])
|
14
|
+
show_list.push show
|
15
|
+
end
|
16
|
+
show_list.sort_by(&:title)
|
17
|
+
end
|
18
|
+
|
19
|
+
def self.create_search_sequel_list(json_obj)
|
20
|
+
sequel_list = []
|
21
|
+
json_obj.each do |relations|
|
22
|
+
next unless relations['relation'] == 'Sequel'
|
23
|
+
|
24
|
+
relations['entry'].each do |entry|
|
25
|
+
image_url = Query.get_anime_image(entry['mal_id'])
|
26
|
+
sequel_list.push Sequel.new(entry['mal_id'], entry['name'], image_url)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
sequel_list.sort_by(&:title)
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
require 'json'
|
4
|
+
|
5
|
+
module Organo
|
6
|
+
class Writer
|
7
|
+
def self.to_data_file(obj, file_name)
|
8
|
+
file_path = "./#{file_name}.data.json"
|
9
|
+
File.write(file_path, JSON.pretty_generate(obj))
|
10
|
+
end
|
11
|
+
|
12
|
+
def self.to_file(obj, file_path)
|
13
|
+
File.write(file_path, JSON.pretty_generate(obj))
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
data/lib/organo.rb
ADDED
@@ -0,0 +1,61 @@
|
|
1
|
+
require 'dry/cli'
|
2
|
+
|
3
|
+
require_relative 'organo/commands/init'
|
4
|
+
require_relative 'organo/commands/anime/anime_add'
|
5
|
+
require_relative 'organo/commands/anime/anime_add_sequel'
|
6
|
+
require_relative 'organo/commands/anime/anime_get_broken_links'
|
7
|
+
require_relative 'organo/commands/anime/anime_remove'
|
8
|
+
require_relative 'organo/commands/anime/anime_show'
|
9
|
+
require_relative 'organo/commands/anime/anime_search'
|
10
|
+
require_relative 'organo/commands/anime/anime_update_image'
|
11
|
+
require_relative 'organo/commands/anime/anime_update_query'
|
12
|
+
require_relative 'organo/commands/api/api_get_anime'
|
13
|
+
require_relative 'organo/commands/api/api_get_sequels'
|
14
|
+
require_relative 'organo/commands/api/api_get_season'
|
15
|
+
require_relative 'organo/commands/api/api_search_anime'
|
16
|
+
require_relative 'organo/commands/remote/remote_add'
|
17
|
+
require_relative 'organo/commands/remote/remote_remove'
|
18
|
+
require_relative 'organo/commands/remote/remote_download'
|
19
|
+
require_relative 'organo/commands/remote/remote_upload'
|
20
|
+
require_relative 'organo/commands/merge'
|
21
|
+
require_relative 'organo/commands/version'
|
22
|
+
require_relative 'organo/commands/statistics'
|
23
|
+
require_relative 'organo/commands/schedule/schedule_create'
|
24
|
+
|
25
|
+
module Organo
|
26
|
+
module CLI
|
27
|
+
module Commands
|
28
|
+
extend Dry::CLI::Registry
|
29
|
+
|
30
|
+
register 'version', Version, aliases: %w[v -v --version]
|
31
|
+
register 'init', Init
|
32
|
+
register 'anime' do |prefix|
|
33
|
+
prefix.register 'add', Anime::Add::AnimeEntry
|
34
|
+
prefix.register 'add sequel', Anime::Add::SequelEntry
|
35
|
+
prefix.register 'remove', Anime::Remove
|
36
|
+
prefix.register 'show', Anime::Show
|
37
|
+
prefix.register 'search', Anime::Search
|
38
|
+
prefix.register 'update image', Anime::Update::Image
|
39
|
+
prefix.register 'update search_query', Anime::Update::SearchQuery
|
40
|
+
prefix.register 'get broken_links', Anime::Get::BrokenLinks
|
41
|
+
end
|
42
|
+
register 'api' do |prefix|
|
43
|
+
prefix.register 'get anime', API::Get::Anime
|
44
|
+
prefix.register 'get season', API::Get::Season
|
45
|
+
prefix.register 'get sequels', API::Get::Sequels
|
46
|
+
prefix.register 'search anime', API::Search::Anime
|
47
|
+
end
|
48
|
+
register 'merge', Merge
|
49
|
+
register 'statistics', Statistics
|
50
|
+
register 'remote' do |prefix|
|
51
|
+
prefix.register 'add', Remote::Add
|
52
|
+
prefix.register 'remove', Remote::Remove
|
53
|
+
prefix.register 'download', Remote::Download
|
54
|
+
prefix.register 'upload', Remote::Upload
|
55
|
+
end
|
56
|
+
register 'schedule' do |prefix|
|
57
|
+
prefix.register 'create', Schedule::Create
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
metadata
ADDED
@@ -0,0 +1,141 @@
|
|
1
|
+
--- !ruby/object:Gem::Specification
|
2
|
+
name: organo
|
3
|
+
version: !ruby/object:Gem::Version
|
4
|
+
version: 0.3.0
|
5
|
+
platform: ruby
|
6
|
+
authors:
|
7
|
+
- Louis-Philippe Fortin
|
8
|
+
autorequire:
|
9
|
+
bindir: exe
|
10
|
+
cert_chain: []
|
11
|
+
date: 2023-02-05 00:00:00.000000000 Z
|
12
|
+
dependencies:
|
13
|
+
- !ruby/object:Gem::Dependency
|
14
|
+
name: dry-cli
|
15
|
+
requirement: !ruby/object:Gem::Requirement
|
16
|
+
requirements:
|
17
|
+
- - "~>"
|
18
|
+
- !ruby/object:Gem::Version
|
19
|
+
version: '1.0'
|
20
|
+
type: :runtime
|
21
|
+
prerelease: false
|
22
|
+
version_requirements: !ruby/object:Gem::Requirement
|
23
|
+
requirements:
|
24
|
+
- - "~>"
|
25
|
+
- !ruby/object:Gem::Version
|
26
|
+
version: '1.0'
|
27
|
+
- !ruby/object:Gem::Dependency
|
28
|
+
name: httparty
|
29
|
+
requirement: !ruby/object:Gem::Requirement
|
30
|
+
requirements:
|
31
|
+
- - "~>"
|
32
|
+
- !ruby/object:Gem::Version
|
33
|
+
version: '0.21'
|
34
|
+
type: :runtime
|
35
|
+
prerelease: false
|
36
|
+
version_requirements: !ruby/object:Gem::Requirement
|
37
|
+
requirements:
|
38
|
+
- - "~>"
|
39
|
+
- !ruby/object:Gem::Version
|
40
|
+
version: '0.21'
|
41
|
+
- !ruby/object:Gem::Dependency
|
42
|
+
name: rest-client
|
43
|
+
requirement: !ruby/object:Gem::Requirement
|
44
|
+
requirements:
|
45
|
+
- - "~>"
|
46
|
+
- !ruby/object:Gem::Version
|
47
|
+
version: '2.1'
|
48
|
+
type: :runtime
|
49
|
+
prerelease: false
|
50
|
+
version_requirements: !ruby/object:Gem::Requirement
|
51
|
+
requirements:
|
52
|
+
- - "~>"
|
53
|
+
- !ruby/object:Gem::Version
|
54
|
+
version: '2.1'
|
55
|
+
- !ruby/object:Gem::Dependency
|
56
|
+
name: rubocop
|
57
|
+
requirement: !ruby/object:Gem::Requirement
|
58
|
+
requirements:
|
59
|
+
- - "~>"
|
60
|
+
- !ruby/object:Gem::Version
|
61
|
+
version: '1.44'
|
62
|
+
type: :development
|
63
|
+
prerelease: false
|
64
|
+
version_requirements: !ruby/object:Gem::Requirement
|
65
|
+
requirements:
|
66
|
+
- - "~>"
|
67
|
+
- !ruby/object:Gem::Version
|
68
|
+
version: '1.44'
|
69
|
+
description: Get JSON data from Jikan, an unofficial MyAnimeList API, that can be
|
70
|
+
used on an anime website
|
71
|
+
email:
|
72
|
+
- timemaster.lpf@gmail.com
|
73
|
+
executables:
|
74
|
+
- organo
|
75
|
+
extensions: []
|
76
|
+
extra_rdoc_files: []
|
77
|
+
files:
|
78
|
+
- Gemfile
|
79
|
+
- LICENSE.txt
|
80
|
+
- README.md
|
81
|
+
- exe/organo
|
82
|
+
- lib/organo.rb
|
83
|
+
- lib/organo/commands/anime/anime_add.rb
|
84
|
+
- lib/organo/commands/anime/anime_add_sequel.rb
|
85
|
+
- lib/organo/commands/anime/anime_get_broken_links.rb
|
86
|
+
- lib/organo/commands/anime/anime_remove.rb
|
87
|
+
- lib/organo/commands/anime/anime_search.rb
|
88
|
+
- lib/organo/commands/anime/anime_show.rb
|
89
|
+
- lib/organo/commands/anime/anime_update_image.rb
|
90
|
+
- lib/organo/commands/anime/anime_update_query.rb
|
91
|
+
- lib/organo/commands/api/api_get_anime.rb
|
92
|
+
- lib/organo/commands/api/api_get_season.rb
|
93
|
+
- lib/organo/commands/api/api_get_sequels.rb
|
94
|
+
- lib/organo/commands/api/api_search_anime.rb
|
95
|
+
- lib/organo/commands/init.rb
|
96
|
+
- lib/organo/commands/merge.rb
|
97
|
+
- lib/organo/commands/remote/remote_add.rb
|
98
|
+
- lib/organo/commands/remote/remote_download.rb
|
99
|
+
- lib/organo/commands/remote/remote_remove.rb
|
100
|
+
- lib/organo/commands/remote/remote_upload.rb
|
101
|
+
- lib/organo/commands/schedule/schedule_create.rb
|
102
|
+
- lib/organo/commands/statistics.rb
|
103
|
+
- lib/organo/commands/version.rb
|
104
|
+
- lib/organo/config.rb
|
105
|
+
- lib/organo/jikan_api.rb
|
106
|
+
- lib/organo/query.rb
|
107
|
+
- lib/organo/reader.rb
|
108
|
+
- lib/organo/request.rb
|
109
|
+
- lib/organo/search_show.rb
|
110
|
+
- lib/organo/sequel.rb
|
111
|
+
- lib/organo/show.rb
|
112
|
+
- lib/organo/show_list.rb
|
113
|
+
- lib/organo/version.rb
|
114
|
+
- lib/organo/writer.rb
|
115
|
+
homepage: https://gitlab.com/dkb-weeblets/organo
|
116
|
+
licenses:
|
117
|
+
- MIT
|
118
|
+
metadata:
|
119
|
+
homepage_uri: https://gitlab.com/dkb-weeblets/organo
|
120
|
+
source_code_uri: https://gitlab.com/dkb-weeblets/organo
|
121
|
+
rubygems_mfa_required: 'true'
|
122
|
+
post_install_message:
|
123
|
+
rdoc_options: []
|
124
|
+
require_paths:
|
125
|
+
- lib
|
126
|
+
required_ruby_version: !ruby/object:Gem::Requirement
|
127
|
+
requirements:
|
128
|
+
- - ">="
|
129
|
+
- !ruby/object:Gem::Version
|
130
|
+
version: 3.0.5
|
131
|
+
required_rubygems_version: !ruby/object:Gem::Requirement
|
132
|
+
requirements:
|
133
|
+
- - ">="
|
134
|
+
- !ruby/object:Gem::Version
|
135
|
+
version: '0'
|
136
|
+
requirements: []
|
137
|
+
rubygems_version: 3.2.33
|
138
|
+
signing_key:
|
139
|
+
specification_version: 4
|
140
|
+
summary: Tool to build dataset from Jikan API
|
141
|
+
test_files: []
|