From 350610c45b44aa68eae8793d5ee238ff1dd6768f Mon Sep 17 00:00:00 2001 From: Cedric Bonhomme Date: Tue, 16 Jan 2024 13:23:58 +0100 Subject: [PATCH] Scripts --- script/Pictures/manga/manga.yaml | 297 ++++++++++++++++ script/Pictures/manga/update.sh | 125 +++++++ script/Videos/transmission-rss.conf | 483 ++++++++++++++++++++++++++ script/bin/album.sh | 5 + script/bin/bspwm_resize | 23 ++ script/bin/bspwmrc | 13 + script/bin/dmenu | 3 + script/bin/epub-thumbnailer | 127 +++++++ script/bin/mixer | 202 +++++++++++ script/bin/mount_sailfish | 11 + script/bin/pidswallow | 234 +++++++++++++ script/bin/rounded_borders.sh | 17 + script/bin/transmission-rss | 7 + script/bin/update-greasemonkey-filter | 8 + script/bin/wallpaper | 7 + terminal/.config/feh/wallpaper.png | Bin 11289959 -> 11289959 bytes 16 files changed, 1562 insertions(+) create mode 100644 script/Pictures/manga/manga.yaml create mode 100755 script/Pictures/manga/update.sh create mode 100644 script/Videos/transmission-rss.conf create mode 100755 script/bin/album.sh create mode 100755 script/bin/bspwm_resize create mode 100755 script/bin/bspwmrc create mode 100755 script/bin/dmenu create mode 100755 script/bin/epub-thumbnailer create mode 100755 script/bin/mixer create mode 100755 script/bin/mount_sailfish create mode 100755 script/bin/pidswallow create mode 100755 script/bin/rounded_borders.sh create mode 100755 script/bin/transmission-rss create mode 100755 script/bin/update-greasemonkey-filter create mode 100755 script/bin/wallpaper diff --git a/script/Pictures/manga/manga.yaml b/script/Pictures/manga/manga.yaml new file mode 100644 index 0000000..36eba38 --- /dev/null +++ b/script/Pictures/manga/manga.yaml @@ -0,0 +1,297 @@ +--- +mangadex: + - url: "https://mangadex.org/title/658b9adf-33c5-439d-9df3-9650c0649bf9" + name: Mazumeshi Elf to Yuboku gurashi + volume: true + - url: "https://mangadex.org/title/7c418a1c-9241-451e-995a-31f673b4340a" + name: Maou-jou de Oyasumi + - url: "https://mangadex.org/title/d4ff7502-b5d4-4fd2-845f-c8754b14dd8d" + name: Machikado Mazoku + volume: true + group: "'Sunrise Arrow'" + - url: "https://mangadex.org/title/b0b721ff-c388-4486-aa0f-c2b0bb321512" + name: Sousou no Frieren + volume: true + - url: "https://mangadex.org/title/3df1a9a3-a1be-47a3-9e90-9b3e55b1d0ac" + name: Boku no Kokoro no Yabai Yatsu + volume: true + - url: "https://mangadex.org/title/190616bc-7da6-45fd-abd4-dd2ca656c183" + name: Ganbare, Douki-chan + - url: "https://mangadex.org/title/a77742b1-befd-49a4-bff5-1ad4e6b0ef7b" + name: Chainsaw Man + volume: true + - url: "https://mangadex.org/title/d7037b2a-874a-4360-8a7b-07f2899152fd" + name: Mairimashita! Iruma-kun + volume: true + - url: "https://mangadex.org/title/dce64fa7-28b5-42a4-8810-149391adfae7" + name: The Rise of the Unemployed Wise Man + - url: "https://mangadex.org/title/3ecd78d9-c686-46f8-8e74-d91a3d7e7958" + name: Ueno-san wa Bukiyou + volume: true + - url: "https://mangadex.org/title/509b1474-cb0a-4f9d-8ca4-95cb44c9b8db" + name: Boku no Tsuma wa Kanjou ga Nai + volume: true + - url: "https://mangadex.org/title/1e6ef441-f72b-4337-94d5-73b111406a3e" + name: Tonari no Kyuuketsuki-san + volume: true + - url: "https://mangadex.org/title/c3f9ce13-c465-48f2-9480-c4ce47d89b3d" + name: My Childhood Friend the Vampire + - url: "https://mangadex.org/title/8847f905-550d-4fe6-bcda-ac2b896789c7" + name: Golden Kamuy + - url: "https://mangadex.org/title/4e7a4a0f-8391-4069-839b-de2352297dab" + name: A Couple of Cuckoos + - url: "https://mangadex.org/title/47c8e8a2-97fc-415e-aa78-f02b276612e2" + name: Sore wa rei no Shiwaza desu + - url: "https://mangadex.org/title/eeea01ed-4838-45ca-8e90-88d6f6e95603" + name: Cuprum’s Bride + - url: "https://mangadex.org/title/a944aace-6f03-4298-b864-aee895acab28" + name: Endo and Kobayashi’s Live Commentary on the Villainess + volume: true + - url: "https://mangadex.org/title/a96676e5-8ae2-425e-b549-7f15dd34a6d8" + name: Komi-san wa Komyushou Desu. + - url: "https://mangadex.org/title/88eb1a22-3b66-4a72-b786-0864a56902b5" + name: Sumire 17-sai!! + completed: true + - url: "https://mangadex.org/title/66102488-d47f-423b-8cb6-44e98cdb0ad3" + name: Sumire 16-sai!! + completed: true + - url: "https://mangadex.org/title/efb4278c-a761-406b-9d69-19603c5e4c8b" + name: The 100 Girlfriends Who Really, Really, Really, Really, Really Love You + volume: true + - url: "https://mangadex.org/title/881fccb1-e60c-4c82-b64c-28f709545174" + name: Medaka Box + volume: true + - url: "https://mangadex.org/title/6670ee28-f26d-4b61-b49c-d71149cd5a6e" + name: Mieruko-chan + volume: true + - url: "https://mangadex.org/title/60e6eb5e-6798-4614-928f-064e65aabe16" + name: Jishou Akuyaku Reijou na Konyakusha no Kansatsu Kiroku + volume: true + - url: "https://mangadex.org/title/ef96c21c-6838-43d1-9b6e-cb30546bba8c" + name: Spirit Circle + completed: true + - url: "https://mangadex.org/title/af38f328-8df1-4b4c-a272-e737625c3ddc" + name: Senpai ga Uzai Kouhai no Hanashi + group: "'White Cat Scanlations', 'STALKER Scanlation'" + - url: "https://mangadex.org/title/878634d2-ea39-4001-a4bf-31458020d16a" + name: Villainess Level 99 ~I May Be the Hidden Boss but I'm Not the Demon Lord~ + volume: true + - url: "https://mangadex.org/title/a50aa56e-2655-4404-8232-e4970ee63e27" + name: Rokudou no Onna-tachi + volume: true + - url: "https://mangadex.org/title/b84a9c69-624b-4c4f-ac57-8d9a162883f1" + name: Useless Ponko + volume: true + - url: "https://mangadex.org/title/19465f6a-1c11-4179-891e-68293402b883" + name: Murenase! Shiiton Gakuen + - url: "https://mangadex.org/title/d90ea6cb-7bc3-4d80-8af0-28557e6c4e17" + name: Dungeon Meshi + volume: true + - url: "https://mangadex.org/title/3fbeec9f-9c47-4565-8f79-972807c99279" + name: Sengoku Youko + volume: true + - url: "https://mangadex.org/title/6ebe8b8a-7bac-45f0-8652-4b9d52b95644" + name: Hoshi no Samidare + volume: true + - url: "https://mangadex.org/title/fd604f6e-a784-4c6b-ab00-565a996c33f8" + name: Ryuu to Yuusha to Haitatsunin + volume: true + - url: "https://mangadex.org/title/57b8b608-1026-4cab-ad6a-28d796eca663" + name: Little Girl x Scoop x Evil Eye + - url: "https://mangadex.org/title/18649fc7-410f-4509-9283-2e5d2a4cf2d4" + name: Giri-Giri Saegiru Katagirisan + completed: true + - url: "https://mangadex.org/title/9ef97eba-e0bc-452c-9ed0-bfb645d9b536" + name: Hitoribocchi no ○○ Seikatsu + volume: true + - url: "https://mangadex.org/title/0b68801b-2daa-44d8-b0c5-d909c27928b3" + name: The Troubles of a Fortune Teller + - url: "https://mangadex.org/title/84703c86-eb83-45ec-8fc5-f34a25115893" + name: Dai Dark + volume: true + - url: "https://mangadex.org/title/cade38b7-64c4-4a29-8e3c-8c283291d6c6" + name: Houseki no Kuni + hiatus: true + - url: "https://mangadex.org/title/cedc7401-8c70-4057-b14a-4ecbbcd73945" + name: Otoyomegatari + hiatus: true + - url: "https://mangadex.org/title/59a592fa-91fa-4486-a05b-8c947a1b20eb" + name: Taimashi to Akuma-chan + volume: true + - url: "https://mangadex.org/title/d86cf65b-5f6c-437d-a0af-19a31f94ec55" + name: Ijiranaide, Nagatoro-san + volume: true + - url: "https://mangadex.org/title/d8f1d7da-8bb1-407b-8be3-10ac2894d3c6" + name: Isekai Ojisan + group: "'Striptease', 'Kontol ✓', 'Dead Elf Scans', 'Big Chungus Scans', 'Isekai Ojiscan', 'Afiaki', 'Unko Scans', 'alt.ver.', 'no group', '/a/nonymous'" + - url: "https://mangadex.org/title/eeb2ab0e-7dbc-4f0c-b476-8181d44217a8" + name: Tengoku Daimakyou + volume: true + - url: "https://mangadex.org/title/4ad8613b-1987-4d6f-ac0e-3d28a9b2b6f2" + name: Franken Fran Frantic + volume: true + - url: "https://mangadex.org/title/9b78663c-850f-434b-8b33-d88d43cc3151" + name: Arakure Ojousama wa Monmon Shiteiru + volume: true + - url: "https://mangadex.org/title/feff4eaf-01df-4a05-83f4-68bb5cdf4fad" + name: Looking up to Magical Girls + volume: true + - url: "https://mangadex.org/title/b7d069cb-4ab9-4c21-a20b-38f7c269be4e" + name: One Punch Man (Webcomic/Original) + hiatus: false + - url: "https://mangadex.org/title/801513ba-a712-498c-8f57-cae55b38cc92" + name: Berserk + hiatus: true + - url: "https://mangadex.org/title/e4687487-9235-496d-9289-ea3ff955d3c0" + name: Send My Regards to Kenshiro + volume: true + - url: https://mangadex.org/title/21758/kaifuku-jutsushi-no-yarinaoshi + name: Kaifuku Jutsushi no Yarinaoshi + - url: "https://mangadex.org/title/7a36beba-1365-46de-8220-28c193572ac7" + name: Ushiro no Shoumen Kamui-san + - url: "https://mangadex.org/title/c26269c7-0f5d-4966-8cd5-b79acb86fb7a" + name: Sewayaki Kitsune no Senko-san + volume: true + - url: "https://mangadex.org/title/6e156d65-cf65-4d5b-9d04-52f2f8100fbf" + name: Isekai Apocalypse MYNOGHRA ~The Conquest of the World Starts With the Civilisation of Ruin~ + volume: true + - url: "https://mangadex.org/title/578ca54a-0aaa-4928-8dd1-219a706299f9" + name: Another World Where I Can't Even Collapse and Die + - url: "https://mangadex.org/title/740471f5-4f75-457a-8c0c-cb4e0a5a999f" + name: Fushigi no Kuni no Bird + volume: true + - url: "https://mangadex.org/title/19e58e5a-4ecc-4f77-8b01-1ba7c615295d" + name: Kumo Desu ga, Nani ka? Daily Life of the Four Spider Sisters + - url: "https://mangadex.org/title/eb2d1a45-d4e7-4e32-a171-b5b029c5b0cb" + name: Kumo Desu ga, Nani ka? + volume: true + - url: "https://mangadex.org/title/5a0ab49a-1e9b-4f19-9f86-da5d7d50885a/the-apothecary-will-make-this-battered-elf-happy" + name: The Apothecary Is Gonna Make This Ragged Elf Happy + - url: "https://mangadex.org/title/5f20aded-1216-41e3-b48d-87b0c4d9957c/kono-healer-mendokusai" + name: Kono Healer Mendokusai + volume: true + - url: "https://mangadex.org/title/2f4e5f5b-d930-4266-8c8a-c4cf9a81e51f/jahy-sama-wa-kujikenai" + name: Jahy-sama wa Kujikenai! + volume: true + - url: "https://mangadex.org/title/1180743d-8e38-4c00-b767-c53169fadc6a/tensura-nikki-tensei-shitara-slime-datta-ken" + name: Tensura Nikki Tensei Shitara Slime Datta Ken + volume: true + - url: "https://mangadex.org/title/b89882d5-e2c8-457d-8b74-a70bf0b36b7e/ore-ga-fujoshi-de-aitsu-ga-yuriota-de" + name: Ore ga Fujoshi de Aitsu ga Yuriota de + - url: "https://mangadex.org/title/87ebd557-8394-4f16-8afe-a8644e555ddc/hirayasumi" + name: Hirayasumi + - url: "https://mangadex.org/title/5725100d-81bd-467d-b680-1f4dff43adbd/kyuuketsuki-sugu-shinu" + name: Kyuuketsuki Sugu Shinu + # name: The Vampire Dies in No Time + - url: "https://mangadex.org/title/665766a3-905d-4a71-a90a-bd2c75d1a81f/alice-in-borderland" + name: Alice in Borderland + volume: true + - url: "https://mangadex.org/title/a56698e8-b6c4-4e3c-9303-4c172465dd4d/imawabi-no-dakini" + name: Imawabi no Dakini + volume: true + completed: true + - url: "https://mangadex.org/title/6316eac8-53cc-4ac8-bc6b-7c5e229ac607/there-s-a-ghost-behind-the-gyaru" + name: There's a Ghost Behind the Gyaru + completed: true + - url: "https://mangadex.org/title/a892e04c-e20c-4fd3-9169-d620cee8dbd4/my-divorced-crybaby-neighbour" + name: My Divorced Crybaby Neighbour + - url: "https://mangadex.org/title/4088c3cc-6be2-4fb6-80b5-8d8606f00196/shinka-no-mi" + name: Shinka no Mi + - url: "https://mangadex.org/title/835feda4-2db0-4753-8249-4575a3ceffe2/kenja-no-mago" + volume: true + name: Kenja no Mago + - url: "https://mangadex.org/title/08a25bd7-ce34-4630-8552-b93fe16852d9/time-stop-brave" + name: Time Stop Brave + - url: "https://mangadex.org/title/eba602f3-5e5d-48ff-b054-d7776181e27c/akazukin-no-ookami-deshi" + name: Akazukin no Ookami Deshi + - url: "https://mangadex.org/title/7ce22c9e-5939-435e-b067-64ce659bb3b3/hazure-skill-gacha-de-tsuihou-sareta-ore-wa-wagamama-osananajimi-wo-zetsuen-shi-kakusei-suru" + name: Hazure Skill “Gacha” de Tsuihou Sareta Ore wa, Wagamama Osananajimi wo Zetsuen Shi Kakusei Suru + - url: "https://mangadex.org/title/cc121572-858e-4bd2-b5f3-ef505eca0081/hazure-skill-kage-ga-usui-o-motsu-guild-shokuin-ga-jitsuha-densetsu-no-ansatsusha" + name: Hazure Skill "Kage ga Usui" o Motsu Guild Shokuin ga, Jitsuha Densetsu no Ansatsusha + - url: "https://mangadex.org/title/1d44fa52-e344-42bd-9182-7b5887e1fe2c/i-became-the-mother-of-the-strongest-demon-lord-s-10-children-in-another-world" + name: I Became the Mother of the Strongest Demon Lord's 10 Children in Another World. + volume: true + - url: "https://mangadex.org/title/bc94b9a7-e17e-4a00-be92-882ba520cb85/youjo-shachou" + name: Youjo Shachou + volume: true + - url: "https://mangadex.org/title/0d8da574-3a62-48a8-aad2-05225160b1a6/one-piece-in-love" + name: One Piece in Love + - url: "https://mangadex.org/title/8f22b5ff-2d76-4f5d-9b35-7969de2dc66d/amagi-brilliant-park" + name: Amagi Brilliant Park + volume: true + - url: "https://mangadex.org/title/a971a398-192c-457d-b803-78b029fb3c7f/reki-yomi" + name: Reki Yomi + volume: true + - url: https://mangadex.org/title/607f0bbc-e36d-46af-9efd-b74a40cbbe9d/homeless-tensei-isekai-de-jiyuu-sugiru-jikyuu-jisoku-seikatsu + name: "Homeless Tensei: Isekai de Jiyuu Sugiru Jikyuu Jisoku Seikatsu" + - url: "https://mangadex.org/title/bd29a3d0-9551-45e3-b1ac-941214e535b5/heterogeneous-linguistics" + name: Heterogeneous Linguistics + - url: "https://mangadex.org/title/6057cba5-2300-4579-9acd-f19efd150270/yankee-shota-to-otaku-onee-san" + name: Yankee Shota to Otaku Onee-san + volume: true + - url: https://mangadex.org/title/843c31ff-d390-4199-bc3b-94b0dfc63632/baki-gaiden-retsu-kaioh-isekai-tensei-shitemo-ikk-kamawan + name: "Baki Gaiden - Retsu Kaioh Isekai Tensei Shitemo Ikkō Kamawan!" + - url: "https://mangadex.org/title/ffe69cc2-3f9e-4eab-a7f7-c963cea9ec25/lonely-attack-on-a-different-world" + name: Lonely Attack on a Different World + volume: true + - url: "https://mangadex.org/title/ec514ef4-fb77-43b9-b9b4-528229de1308/enen-no-shouboutai" + name: Enen no Shouboutai + volume: true + - url: "https://mangadex.org/title/70fe972b-3c88-4165-b9a5-3db96d6d2c14/shikkaku-mon-no-saikyou-kenja-sekai-saikyou-no-kenja-ga-sara-ni-tsuyokunaru-tame-ni-tensei" + name: "Shikkaku Mon no Saikyou Kenja - Sekai Saikyou no Kenja ga Sara ni Tsuyokunaru Tame ni Tensei Shimashita" + - url: "https://mangadex.org/title/c2b32bf8-5015-4ef0-9bbf-a4e63033dabb/senmetsumadou-no-saikyou-kenja-musai-no-kenja-madou-wo-kiwame-saikyou-e-itaru" + name: "Senmetsumadou no Saikyou Kenja: Musai no Kenja, Madou wo Kiwame Saikyou e Itaru" + volume: true + - url: "https://mangadex.org/title/b4615bd9-7cbd-4243-a8a2-5c24671663e0/yajin-tensei-karate-survivor-in-another-world" + name: "Yajin Tensei: Karate Survivor in Another World" + - url: "https://mangadex.org/title/08a25bd7-ce34-4630-8552-b93fe16852d9/jikan-teishi-yuusha-yomei-3-ka-no-settei-ja-sekai-wo-sukuu-ni-wa-mijika-sugiru" + name: "Jikan Teishi Yuusha - Yomei 3-ka no Settei ja Sekai wo Sukuu ni wa Mijika Sugiru" + - url: "https://mangadex.org/title/42603601-3659-430f-8306-ca703a884afe/uso-bitch-senpai?tab=chapters" + name: "Uso-Bitch Senpai" + - url: "https://mangadex.org/title/310d5beb-79fd-4a48-a028-95a016307efb/busted-darklord" + name: "Busted! Darklord" + - url: "https://mangadex.org/title/e0f2c98b-759d-4a86-8a73-7ed110eb32e3/elf-to-shuryoushi-no-item-koubou" + name: "Elf to Shuryoushi no Item Koubou" + volume: true + - url: "https://mangadex.org/title/c4c04636-3774-4f39-8424-e1aef59ac6ff/the-mermaid-princess-s-guilty-meal" + name: "The Mermaid Princess's Guilty Meal" + volume: true + - name: "The Girl, the Shovel, and the Evil Eye" + url: "https://mangadex.org/title/57b8b608-1026-4cab-ad6a-28d796eca663/the-girl-the-shovel-and-the-evil-eye" + - name: "The Exiled Reincarnated Heavy Knight Is Unrivaled in Game Knowledge" + url: "https://mangadex.org/title/7c5ee2ae-5bed-4e72-8d75-91e3b8e9787a/the-exiled-reincarnated-heavy-knight-is-unrivaled-in-game-knowledge" + - name: "Kage no Jitsuryokusha ni Naritakute" + url: "https://mangadex.org/title/77bee52c-d2d6-44ad-a33a-1734c1fe696a/kage-no-jitsuryokusha-ni-naritakute?tab=chapters" + volume: true + - name: "Vampeerz" + url: "https://mangadex.org/title/c431712b-231c-4d25-85fa-7ca6bf460f15/vampeerz" + volume: true + - name: "The Maid Who Can't Hide Her Feelings (Pre-serialization)" + url: "https://mangadex.org/title/9b2e2852-2dff-4797-bc51-c18fac8b181e/the-maid-who-can-t-hide-her-feelings-pre-serialization" + - name: "Tensei Shitara Ken Deshita" + url: "https://mangadex.org/title/77fd8118-61b0-4b1f-95a6-2b839d754f81/tensei-shitara-ken-deshita" + volume: true + - name: "Zombie 100 ~Zombie ni Naru Made ni Shitai 100 no Koto~" + url: "https://mangadex.org/title/efd02206-1cd8-4823-b497-02bb8b8d09ca/zombie-100-zombie-ni-naru-made-ni-shitai-100-no-koto" + volume: true + - name: "Orc Hero Story - Discovery Chronicles" + url: "https://mangadex.org/title/cc1fc741-8ba5-4a18-9843-5d59d8a98d0d/orc-hero-story-discovery-chronicle" + - name: "Dungeon no Osananajimi" + url: "https://mangadex.org/title/8572da1b-3b5d-44aa-a40c-8a92b512c336/dungeon-no-osananajimi" + - name: "Shinmai Ossan Bouken-sha, Saikyou paati ni shinu hodo kitae rarete Muteki ni naru" + url: "https://mangadex.org/title/a2320293-f00e-43a0-8d08-1110cf26a894/shinmai-ossan-bouken-sha-saikyou-paati-ni-shinu-hodo-kitae-rarete-muteki-ni-naru" + - name: "JoJo's Bizarre Adventure Part 9 - The JOJOLands" + url: "https://mangadex.org/title/ab8cbb82-d0ed-45a7-8ffe-4bfa6d43d79c/jojo-s-bizarre-adventure-part-9-the-jojolands" + - name: "Ore no Kokan wa Bishoujo Datta no ka" + url: "https://mangadex.org/title/cf923481-1e96-4959-b3c1-9518718a4cc2/ore-no-kokan-wa-bishoujo-datta-no-ka" + - name: "Yuko Sae Tatakaeba" + url: "https://mangadex.org/title/e750ebbd-e54a-412c-92d0-e3c183692527/yuko-sae-tatakaeba" + volume: true + - url: "https://mangadex.org/title/daa29882-e5c4-4d24-8dc9-efb407a9e84b/tonari-no-seki-kun-junior?tab=chapters" + name: "Tonari no Seki-kun Junior" + volume: true + - url: "https://mangadex.org/title/5896e05d-3900-4947-baf8-403a9d8fa5ec/nick-lever" + name: "Nick & Lever" + volume: true + - url: "https://mangadex.org/title/71c05dbe-2012-4a7b-bc22-4970b7d0afc4/ani-to-imouto-no-shitai-shitai-shitai-koto" + name: "Ani to Imouto no Shitai Shitai Shitai Koto" diff --git a/script/Pictures/manga/update.sh b/script/Pictures/manga/update.sh new file mode 100755 index 0000000..8b05ba3 --- /dev/null +++ b/script/Pictures/manga/update.sh @@ -0,0 +1,125 @@ +#!/usr/bin/env sh + +normal=$(tput sgr0) # normal text +bold=$(tput bold) # make colors bold/bright +purple=$(tput setaf 5); # magenta text +pink="$bold$purple" # bright magenta text +darkcyan=$(tput setaf 6) # dim cyan text +cyan="$bold$darkcyan" # bright cyan text +#red="$bold$(tput setaf 1)" # bright red text +#green=$(tput setaf 2) # dim green text +#fawn=$(tput setaf 3); beige="$fawn" # dark yellow text +#yellow="$bold$fawn" # bright yellow text +#darkblue=$(tput setaf 4) # dim blue text +#blue="$bold$darkblue" # bright blue text +#gray=$(tput setaf 7) # dim white text +#darkgray="$bold"$(tput setaf 0) # bold black = dark gray text +#white="$bold$gray" # bright white text + +MANGA_DIR="$HOME/Pictures/manga/mangadex" + +# IN: text color icon +pprint() { + color=${2:-$cyan} + icon=${3:-" "} + echo "${color}${icon} ${1}${normal}" +} + +# progress() { +# CHAPTER_ID=1234 +# curl -xPOST "https://mangadex.org/ajax/actions.ajax.php?function=chapter_mark_read&id=$CHAPTER_ID" +# # Unselect: curl -xPOST "https://mangadex.org/ajax/actions.ajax.php?function=chapter_mark_unread&id=$CHAPTER_ID" +# } + +# IN: .dir +# OUT: [string] last chapter +chapter() { + result=$(find "$1" -mindepth 1 -type d | sed -rn 's/.*c([0-9]+).*/\1/p' | sort | tail -n1) + [ -n "$result" ] && echo "$result" || echo 0 +} + +# IN: .dir +# OUT: [string] last volume +volume() { + result=$(find "$1" -mindepth 1 -type d | sed -rn 's/.*v([0-9]+).*/\1/p' | sort | tail -n1) + [ -n "$result" ] && echo "$result" || echo 0 +} + +# IN: .url +# OUT: [string] title code +titlecode() { + echo "$1" | sed 's#.*title/\([0-9a-z-]*\).*#\1#g' +} + +# IN: .dir .url +cover() { + DIRECTORY="$1" + TITLE_CODE="$(titlecode "$2")" + + for folder in "$DIRECTORY/"*/ + do + folder=$(echo "$folder" | sed 's#/$##') + VOLUME=$(echo "$folder" | sed -e 's#.*v\([0-9]*\).*#\1#' -e 's/^0//' | bc) + COVER="$folder/000-cover.jpg" + [ ! -f "$COVER" ] && [ "$VOLUME" -ge 0 ] && curl -s -o "$COVER" "https://uploads.mangadex.org//covers/${TITLE_CODE}/$(curl -s "https://api.mangadex.org/cover?manga[]=${TITLE_CODE}&limit=100" | jq -r ".data[].attributes | select(.volume == \"${VOLUME}\") | .fileName")" + [ "$(file -b --mime-type "$COVER")" = "text/html" ] && rm "$COVER" + done +} + +# IN: .dir .url +bookshelf() { + pprint "Generating volumes shortcuts..." "$pink" "└── " + DIRECTORY="$1" + VOLUME=$(volume "$1") + TITLE="$(basename "$DIRECTORY")" + URL="$2" + fish -c "mkdir -p \"$DIRECTORY/$TITLE\"\ v{(seq -s',' -w \"$VOLUME\")}" + seq -w "$VOLUME" | xargs -I% fish -c "mv \"$DIRECTORY/\"v%* \"$DIRECTORY/$TITLE\"\ v%" 2>/dev/null + cover "$DIRECTORY" "$URL" + fish -c "add_manga \"$DIRECTORY\"" +} +# title() { +# gallery-dl -j "$1" | jq -rc '(.[] | reverse)[0].manga' | head -n1 +# } + +# IN: .dir .url .group .refetch .volume +update() { + VOLUME=0 LAST_CHAPTER=0 GROUP_OPTION="" PREFIX="└── " + [ "$5" = "true" ] && PREFIX="├── " + [ "$4" != "true" ] && VOLUME=$(volume "$1" | bc) LAST_CHAPTER=$(chapter "$1" | bc) + [ "$3" != "" ] && [ "$3" != "null" ] && GROUP_OPTION=" and ($3) in group" + pprint "v$VOLUME c$LAST_CHAPTER" "$pink" "$PREFIX" + CHAPTER_FILTER="lang == 'en' and chapter > $LAST_CHAPTER$GROUP_OPTION" + # echo "gallery-dl -d . \"$2\" --chapter-filter \"$CHAPTER_FILTER\"" + gallery-dl -d . "$2" --chapter-filter "$CHAPTER_FILTER" + [ "$5" = "true" ] && bookshelf "$1" "$2" +} + +_manga() { + pprint "Updating chapters from group $1..." "$bold" + + list=$(yq -cr ."$1[]" "$HOME/Pictures/manga/manga.yaml" | grep "$2" | jq -r '. | @base64') + for row in $list; do + _jq() { + echo "${row}" | base64 --decode | jq -r "${1}" + } + packageurl=$(_jq '.url') + packagename=$(_jq '.name') + packagegroup=$(_jq '.group') + packagerefetch=$(_jq '.refetch') + packagecompleted=$(_jq '.completed') + packagehiatus=$(_jq '.hiatus') + packagevolume=$(_jq '.volume') + packagedir="$MANGA_DIR/$packagename" + pprint "Updating $packagename..." "$cyan" " " + { [ "$packagecompleted" = "true" ] || [ "$packagehiatus" = "true" ]; } || update "$packagedir" "$packageurl" "$packagegroup" "$packagerefetch" "$packagevolume" + done +} + +main() { + [ ! -x "/bin/yq" ] && sudo xbps-install -S yq jq + + _manga "mangadex" "$@" +} + +main "$@" diff --git a/script/Videos/transmission-rss.conf b/script/Videos/transmission-rss.conf new file mode 100644 index 0000000..5742802 --- /dev/null +++ b/script/Videos/transmission-rss.conf @@ -0,0 +1,483 @@ +--- +# vi: set ft=yaml : + +# List of feeds to watch. +feeds: + # - url: https://nyaa.si/?page=rss&q=erai+Ore+dake+Haireru+Kakushi+Dungeon+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=erai+Dragon+Quest+-+Dai+no+Daibouken+1080&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Dragon Quest - Dai no Daibouken" + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+Hataraku+Saibou+Black+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+hataraku+saibou%21%21+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!v0).)*$ + # - url: https://nyaa.si/?page=rss&q=rom+rem+kaifuku+1080+uncensored&c=1_2&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+yuru+camp+season+2+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+tatoeba+last+dungeon+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=non+non+biyori+erai+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+Azur+Lane+Bisoku+Zenshin+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=subsplease+Urasekai+Picnic+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=entame+yu-gi-oh&c=1_2&f=0 + # download_path: "/home/jojo/Videos/Yu-Gi-Oh! SEVENS" + # regexp: (Episode\s[3-9]\d\s) + # - url: https://nyaa.si/?page=rss&q=erai+1080+Tenchi+Souzou+Design&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=molcar+carsplease+mkv&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+Majo+no+Tabitabi+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+slime+2nd+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=horrible+Sakamoto+Desu+ga+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=slime+1080p+oad+erai&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=erai+otona+no+bouguya-san+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=thunderbolt+fantasy+deepest+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=+dragon+ie+o+kau+erai+1080&c=0_0&f=0 + # regexp: ^((?!HEVC).)*$ + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=tensura+slime+datta+ken+1080+erai&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+slime+300+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+isekai+maou+omega+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+sentouin+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+1080+Seijo+no+Maryoku+wa+Bannou+Desu&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+1080+Fumetsu+no+Anata+e&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=zombieland+1080+subs&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=iruma+erai+2nd+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=erai+1080+dragon+mini&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!HEVC).)*$ + # - url: https://nyaa.si/?page=rss&q=nagatoro+1080+rom&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=tensei+slime+hollow&c=1_2&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=otome+game+X+chihiro+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=DameDesuYo+Kobayashi-san+Chi+no+Maid+Dragon+S&c=0_0&f=0 + # regexp: Kobayashi-san Chi no Maid Dragon S + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=subsplease+Tsuki+ga+Michibiku+Isekai+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=subsplease+cheat+kusushi+no+slow+life+1080&c=1_2&f= + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=Megami-ryou+nyanpasu+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=Seirei+Gensouki+1080+erai&c=1_2&f=0 + # download_path: /home/jojo/Videos + - url: "https://nyaa.si/?page=rss&q=jahy+sama+GJM&c=1_2&f=0" + download_path: "/home/jojo/Videos/Jahy-sama wa Kujikenai!" + # - url: https://nyaa.si/?page=rss&q=ODD+Shinigami+Bocchan+to+Kuro+Maid&c=1_2&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=erai+Meikyuu+Black+Company+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=Heion+Sedai+no+Idaten-tachi+erai+1080&c=1_2&f=0 + # download_path: "/home/jojo/Videos/Heion Sedai no Idaten-tachi" + # - url: https://nyaa.si/?page=rss&q=machiavellian+Genjitsu+Shugi+Yuusha+no+Oukoku+1080&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Genjitsu Shugi Yuusha no Oukoku Saikenki" + # - url: https://nyaa.si/?page=rss&q=Deatte+5-byou+de+Battle+1080+subsplease&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=kuro+maid+erai+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!v0).)*$ + # - url: https://nyaa.si/?page=rss&q=akari+nanawo&c=2_1&f=0 + # download_path: /home/jojo/Music + # - url: https://nyaa.si/?page=rss&q=erai+Genjitsu+Shugi+Yuusha+no+Oukoku+Saikenki+1080&c=0_0&f= + # download_path: /home/jojo/Videos + # regexp: ^((?!v0).)*$ + # # Fall 2021 + # - url: https://nyaa.si/?page=rss&q=Heike+Monogatari+1080+erai&c=0_0&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!v0).)*$ + # - url: https://nyaa.si/?page=rss&q=subsplease+Kyuuketsuki+sugu+shinu+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=shinka+no+mi+1080+subsplease&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=subsplease+isekai+shokudou+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=mieruko+nekomimi+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=MTBB+mushoku+v2&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=Taishou+Otome+1080+subsplease&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=jnzngn+Takt+Op.+Destiny+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=Saihate+no+Paladin+subsplease+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=Shin+no+Nakama+1080+subsplease&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=subsplease+saihate+no+paladin+1080&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=hanashi+1080+subsplease&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=ganbare+douki+1080+erai&c=1_2&f=0 + # download_path: /home/jojo/Videos + # - url: "https://nyaa.si/?page=rss&q=king+ousama+ranking+1080p+mkv&c=0_0&f=0" + # download_path: /home/jojo/Videos/Ousama Ranking + # - url: https://nyaa.si/?page=rss&q=erai+Mushoku+Tensei+2nd+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # regexp: ^((?!v0).)*$ + # - url: https://nyaa.si/?page=rss&q=anime+chap+stone+ocean&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=daddy+kimetsu+entertainment&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Kimetsu no Yaiba" + # - url: https://nyaa.si/?page=rss&q=PQC+Sekai+Saikou+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=official+translated+LN&c=0_0&f=0 + # download_path: /home/jojo/Books + # - url: https://nyaa.si/?page=rss&q=jnzngn+ansatsu+kizoku&c=0_0&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=nosferatu+erai+1080&c=1_2&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=mtbb+mushoku+tensei&c=1_2&f=0 + # download_path: /home/jojo/Videos + # - url: https://nyaa.si/?page=rss&q=NovaWorks+komi+san&c=1_2&f=0 + # regexp: ^((?!AnonymousSubs).)*$ + # download_path: "/home/jojo/Videos/Komi Can't Communicate" + # - url: https://nyaa.si/?page=rss&q=Leadale+no+Daichi+nite+1080+erai&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Leadale no Daichi nite" + # - url: https://nyaa.si/?page=rss&q=Shikkakumon+no+Saikyou+Kenja+1080+subsplease&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Shikkakumon no Saikyou Kenja" + # - url: https://nyaa.si/?page=rss&q=erai+princess+connect+season+2+1080&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Princess Connect! Re-Dive S2" + # - url: https://nyaa.si/?page=rss&q=Kaijin+Kaihatsubu+no+Kuroitsu-san+erai+1080&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Kaijin Kaihatsu-bu no Kuroitsu-san" + # - url: https://nyaa.si/?page=rss&q=sabikui+bisco+1080+erai&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Sabikui Bisco" + # - url: https://nyaa.si/?page=rss&q=+Gensou+Sangokushi+1080+erai&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Gensou Sangokushi" + # - url: https://nyaa.si/?page=rss&q=Kenja+no+Deshi+1080+erai&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Kenja no Deshi wo Nanoru Kenja" + # - url: https://nyaa.si/?page=rss&q=+Tensai+Ouji+no+Akaji+1080+erai&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Tensai Ouji no Akaji Kokka Saiseijutsu" + # - url: https://nyaa.si/?page=rss&q=Fantasy+Bishoujo+Juniku+Ojisan+to+1080+erai&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Fantasy Bishoujo Juniku Ojisan to" + # Spring 2022 + # - url: https://nyaa.si/?page=rss&q=cue+erai+1080&c=1_2&f=0 + # download_path: "/home/jojo/Videos/Cue!" + - url: "https://nyaa.si/?page=rss&q=sono+bisque+gjm&c=1_2&f=0" + download_path: "/home/jojo/Videos/Sono Bisque Doll wa Koi wo Suru" + # # - url: https://nyaa.si/?page=rss&q=slow+loop+loopsub&c=0_0&f=0 + # # download_path: "/home/jojo/Videos/Slow Loop" + # - url: https://nyaa.si/?page=rss&q=Atasha+Kawajiri+Kodama+da+yo+erai+1080&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Atasha Kawajiri Kodama Da yo" + # - url: https://nyaa.si/?page=rss&q=tsundere+vanitas+no+carte+vostfr+mkv+1080&c=0_0&f=0 + # download_path: "/home/jojo/Videos/Vanitas no Carte" + # - url: "https://nyaa.si/?page=rss&q=busted+darklord+nc+raws&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Busted! Darklord" + # - url: "https://nyaa.si/?page=rss&q=cyan+Akebi-chan+no+Sailor-fuku&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Akebi-chan no Sailor-fuku" + # - url: "https://nyaa.si/?page=rss&q=erai+raws+bessatsu+olympia+1080&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Bessatsu Olympia Kyklos" + # - url: "https://nyaa.si/?page=rss&q=Paripi+Koumei+anime+chap+1080&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Paripi Koumei" + # - url: "https://nyaa.si/?page=rss&q=chihiro+Shokei+Shoujo+no+Virgin+Road+1080&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Shokei Shoujo no Virgin Road" + # - url: "https://nyaa.si/?page=rss&q=Otome+Game+Sekai+wa+Mob+ni+Kibishii+Sekai+desu+1080+judas&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Otomege Sekai wa Mob ni Kibishii Sekai Desu" + # - url: "https://nyaa.si/?page=rss&q=Aharen-san+wa+Hakarenai+1080+erai&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Aharen-san wa Hakarenai" + # - url: "https://nyaa.si/?page=rss&q=Yuusha+Yamemasu+subsplease+1080&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Yuusha Yamemasu" + # - url: "https://nyaa.si/?page=rss&q=shijou+Saikyou+no+Daimaou+erai+1080&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Shijou Saikyou no Daimaou Murabito A ni Tensei suru" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=Deaimon+erai+raws+1080&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Deaimon" + # - url: "https://nyaa.si/?page=rss&q=RPG+Fudousan+1080+erai&c=0_0&f=0" + # download_path: "/home/jojo/Videos/RPG Fudousan" + # - url: "https://nyaa.si/?page=rss&q=Gaikotsu+Kishi-sama+1080+erai&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Gaikotsu Kishi-sama" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=Shachiku-san+wa+Youjo+Yuurei+ni+Iyasaretai+1080+erai&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Shachiku-san wa Youjo Yuurei ni Iyasaretai" + # - url: "https://nyaa.si/?page=rss&q=Estab-Life+1080+subsplease&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Estab-Life" + # - url: "https://nyaa.si/?page=rss&q=Koi+wa+Sekai+Seifuku+no+Ato+de+erai+1080&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Koi wa Sekai Seifuku no Ato de" + # - url: "https://nyaa.si/?page=rss&q=loopsubs+mazoku&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Machikado Mazoku S2" + # - url: "https://nyaa.si/?page=rss&q=kono+healer+1080+subsplease&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Kono Healer Mendokusai" + # - url: "https://nyaa.si/?page=rss&q=Kunoichi+Tsubaki+no+Mune+no+Uchi+anime+chap&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Kunoichi Tsubaki no Mune no Uchi" + # - url: "https://nyaa.si/?page=rss&q=spy+x+family+anime+chap&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Spy x Family" + - url: "https://nyaa.si/?page=rss&q=go+rush+entamesubs&c=0_0&f=0" + download_path: "/home/jojo/Videos/Yu-Gi-Oh! GO RUSH" + # - url: "https://nyaa.si/?page=rss&q=onipan+erai+1080&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Onipan!" + # - url: "https://nyaa.si/?page=rss&q=Mahoutsukai+Reimeiki+1080+subsplease&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Mahoutsukai Reimeiki" + # - url: "https://nyaa.si/?page=rss&q=Honzuki+no+Gekokujou+gjm&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Honzuki no Gekokujou" + # - url: "https://nyaa.si/?page=rss&q=space+dandy+commie&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Space Dandy" + # - url: "https://nyaa.si/?page=rss&q=jashin-chan+x+1080+erai&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Jashin-chan Dropkick X" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=Tensei+Kenja+no+Isekai+Life+1080+erai&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Tensei Kenja no Isekai Life" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=Isekai+yakkyoku+1080+erai&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Isekai Yakkyoku" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=Warau+Arsnotoria+Sun+1080+erai&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Warau Arsnotoria Sun!" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=Isekai+Meikyuu+de+Harem+wo+uncensored+mad&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Isekai Meikyuu de Harem wo" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=+Kinsou+no+Vermeil+1080+erai&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Kinsou no Vermeil" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=hataraku+maou-sama+erai+1080&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Hataraku Maou-sama" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=Kuro+no+Shoukanshi+1080+erai&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Kuro no Shoukanshi" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=Saikin+Yatotta+Maid+ga+Ayashii+1080+erai&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Saikin Yatotta Maid ga Ayashii" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=Tensei+Shitara+Ken+Deshita+1080+erai&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Tensei Shitara Ken Deshita" + - url: "https://nyaa.si/?page=rss&q=erai+Kage+no+Jitsuryokusha+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Kage no Jitsuryokusha ni Naritakute" + regexp: ^((?!HEVC).)*$ + - url: "https://nyaa.si/?page=rss&q=futoku+no+guild+anime+chap&c=0_0&f=0" + download_path: "/home/jojo/Videos/Futoku no Guild" + # - url: "https://nyaa.si/?page=rss&q=Seiken+Densetsu+1080+erai&c=0_0&f=0" + # regexp: ^((?!HEVC).)*$ + # download_path: "/home/jojo/Videos/Seiken Densetsu" + # - url: "https://nyaa.si/?page=rss&q=mob+psycho+1080+III+erai&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Mob Psycho 100 S3" + # regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=Akuyaku+Reijou+nanode+Last+Boss+wo+Kattemimashita+1080+anime+chap&c=1_2&f=0" + # download_path: "/home/jojo/Videos/Akuyaku Reijou nanode Last Boss wo Kattemimashita" + # - url: "https://nyaa.si/?page=rss&q=Noumin+Kanren+no+Skill+bakka+Agetetara+Nazeka+Tsuyoku+Natta+1080+subsplease&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Noumin Kanren no Skill bakka Agetetara Nazeka Tsuyoku Natta" + # - url: "https://nyaa.si/?page=rss&q=Yuusha+Party+wo+Tsuihou+sareta+Beast+Tamer+1080+judas&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Yuusha Party wo Tsuihou Sareta Beast Tamer" + - url: "https://nyaa.si/?page=rss&q=iruma+erai+3rd+1080&c=1_2&f=0" + download_path: "/home/jojo/Videos/Mairimashita! Iruma-kun S3" + regexp: ^((?!HEVC).)*$ + - url: "https://nyaa.si/?page=rss&q=peter+grill+super+extra+jackie&c=0_0&f=0" + download_path: "/home/jojo/Videos/Peter Grill to Kenja no Jikan - Super Extra" + - url: "https://nyaa.si/?page=rss&q=bleach+sennen+kessen+nokiya&c=1_2&f=0" + download_path: "/home/jojo/Videos/Bleach" + - url: "https://nyaa.si/?page=rss&q=human+bug+daigaku+1080+erai&c=0_0&f=0" + download_path: "/home/jojo/Videos/Human Bug Daigaku" + regexp: ^((?!HEVC).)*$ + - url: "https://nyaa.si/?page=rss&q=do+it+yourself+pizza&c=0_0&f=0" + download_path: "/home/jojo/Videos/Do it Yourself" + - url: "https://nyaa.si/?page=rss&q=urusei+yatsura+2022+1080+pizza&c=1_2&f=0" + download_path: "/home/jojo/Videos/Urusei Yatsura (2022)" + - url: "https://nyaa.si/?page=rss&q=Shinmai+Renkinjutsushi+no+Tenpo+Keiei+1080+erai&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/home/jojo/Videos/Shinmai Renkinjutsushi no Tenpo Keiei" + - url: "https://nyaa.si/?page=rss&q=moyaicars+molcar+driving&c=1_2&f=0" + download_path: "/home/jojo/Videos/Pui Pui Molcar Driving School" + - url: "https://nyaa.si/?page=rss&q=Uchi+no+Shishou+wa+Shippo+1080+erai&c=1_2&f=0" + download_path: "/home/jojo/Videos/Uchi no Shishou wa Shippo ga Nai" + regexp: ^((?!HEVC).)*$ + # - url: "https://nyaa.si/?page=rss&q=bocchi+the+rock++gotch&c=1_2&f=0" + - url: "https://nyaa.si/?page=rss&q=bocchi+the+rock+erai+1080&c=1_2&f=0" + download_path: "/home/jojo/Videos/Bocchi the Rock" + - url: "https://nyaa.si/?page=rss&q=Akiba+Maid+Sensou+anime+chap&c=1_2&f=0" + download_path: "/home/jojo/Videos/Akiba Maid Sensou" + # - url: "https://nyaa.si/?page=rss&q=shi+cao+lao+1080+mkv&c=0_0&f=0" + # download_path: "/home/jojo/Videos/Shi Cao Lao Long Bei Guanyi E Long Zhi Ming" + - url: "https://nyaa.si/?page=rss&q=jojo+stone+ocean+inid4c&c=0_0&f=0" + download_path: "/home/jojo/Videos/JoJos Bizarre Adventure Stone Ocean" + - url: "https://nyaa.si/?page=rss&q=bocchi+kessoku+band&c=2_1&f=0" + download_path: "/home/jojo/Music" +# ANIME WINTER 2023 + - url: "https://nyaa.si/?page=rss&q=bofuri+takanishi&c=0_0&f=0" + download_path: "/home/jojo/Videos/Bofuri" + - url: "https://nyaa.si/?page=rss&q=tensei+oujo+chihiro&c=0_0&f=0" + download_path: "/home/jojo/Videos/Tensei Oujo to Tensai Reijou no Mahou Kakumei" + - url: "https://nyaa.si/?page=rss&q=Erai-raws+Kyuuketsuki+Sugu+Shinu+2+1080+ENG&c=0_0&f=0" + download_path: "/home/jojo/Videos/Kyuuketsuki Sugu Shinu S2" + - url: "https://nyaa.si/?page=rss&q=tondemo+skill+de+isekai+hourou+meshi+erai+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Tondemo Skill de Isekai Hourou Meshi" + - url: "https://nyaa.si/?page=rss&q=ningen+fushin+no+boukensha+1080+erai&c=0_0&f=0" + download_path: "/home/jojo/Videos/Ningen Fushin no Boukensha-tachi ga Sekai o Sukuu You Desu" + - url: "https://nyaa.si/?page=rss&q=Saikyou+Onmyouji+no+Isekai+Tenseiki+erai+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Saikyou Onmyouji no Isekai Tenseiki" + - url: "https://nyaa.si/?page=rss&q=Saikyou+no+Minarai+Kishi+erai+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Eiyuu Ou, Bu o Kiwameru Tame Tenseisu - Soshite, Sekai Saikyou no Minarai Kishi" + - url: "https://nyaa.si/?page=rss&q=benriya+saitou-san+erai+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Benriya Saitou-san, Isekai ni Iku" + - url: "https://nyaa.si/?page=rss&q=oshimai+okay-subs&c=0_0&f=0" + download_path: "/home/jojo/Videos/Oniichan wa Oshimai!" + - url: "https://nyaa.si/?page=rss&q=Rougo+ni+Sonaete+Isekai+de+8-manmai+no+Kinka+o+Tamemasu+1080+erai&c=0_0&f=0" + download_path: "/home/jojo/Videos/Rougo ni Sonaete Isekai de 8-manmai no Kinka o Tamemasu" + - url: "https://nyaa.si/?page=rss&q=Isekai+Nonbiri+Nouka+erai+1080&c=1_2&f=0" + download_path: "/home/jojo/Videos/Isekai Nonbiri Nouka" + - url: "https://nyaa.si/?page=rss&q=erai+Kami-tachi+ni+Hirowareta+Otoko+2+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Kami-tachi ni Hirowareta Otoko S2" + - url: "https://nyaa.si/?page=rss&q=erai+no+Slow+na+Second+Life+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Kaiko Sareta Ankoku Heishi (30-dai) no Slow na Second Life" + - url: "https://nyaa.si/?page=rss&q=Maou+Gakuin+no+Futekigousha+II+erai+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Maou Gakuin no Futekigousha II" + regexp: ^((?!HEVC).)*$ + - url: "https://nyaa.si/?page=rss&q=Hyouken+no+Majutsushi+ga+Sekai+o+Suberu+erai+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Hyouken no Majutsushi ga Sekai o Suberu" + - url: "https://nyaa.si/?page=rss&q=Tsundere+Akuyaku+Reijou+Liselotte+to+Jikkyou+no+Endou-kun+to+Kaisetsu+no+Kobayashi-san+erai+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Tsundere Akuyaku Reijou Liselotte to Jikkyou no Endou-kun to Kaisetsu no Kobayashi-san" + - url: "https://nyaa.si/?page=rss&q=Otonari+no+Tenshi-sama+ni+Itsunomanika+Dame+Ningen+ni+Sareteita+Ken+erai+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Otonari no Tenshi-sama ni Itsunomanika Dame Ningen ni Sareteita Ken" + - url: "https://nyaa.si/?page=rss&q=Kubo-san+wa+Boku+o+Yurusanai+erai+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Kubo-san wa Boku o Yurusanai" + - url: "https://nyaa.si/?page=rss&q=tomo-chan+1080+erai&c=0_0&f=0" + download_path: "/home/jojo/Videos/Tomo-chan wa Onnanoko!" + - url: "https://nyaa.si/?page=rss&q=Koori+Zokusei+Danshi+to+Cool+na+Douryou+Joshi+erai+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Koori Zokusei Danshi to Cool na Douryou Joshi" + - url: "https://nyaa.si/?page=rss&q=nagatoro+2nd+bullysub&c=0_0&f=0" + download_path: "/home/jojo/Videos/Ijiranaide, Nagatoro-san 2nd Attack" + - url: "https://nyaa.si/?page=rss&q=inu+ni+nattara+suki+mgv&c=0_0&f=0" + download_path: "/home/jojo/Videos/Inu ni Nattara Suki na Hito ni Hirowareta" + - url: "https://nyaa.si/?page=rss&q=magical+destroyer+1080+otakuhero&c=1_2&f=0" + download_path: "/home/jojo/Videos/Mahou Shoujo Magical Destroyers" + - url: "https://nyaa.si/?page=rss&q=kuma+kuma+bear+s2+nines&c=1_2&f=0" + download_path: "/home/jojo/Videos/Kuma Kuma Kuma Bear Punch!" + - url: "https://nyaa.si/?page=rss&q=Kaminaki+Sekai+no+Kamisama+Katsudou+erai+1080&c=1_2&f=0" + download_path: "/home/jojo/Videos/Kaminaki Sekai no Kamisama Katsudou" + regexp: ^((?!HEVC).)*$ + - url: "https://nyaa.si/?page=rss&q=Kawaisugi+Crisis+seigyoku&c=1_2&f=0" + download_path: "/home/jojo/Videos/Kawaisugi Crisis" + - url: "https://nyaa.si/?page=rss&q=Kono+Subarashii+Sekai+ni+Bakuen+wo%21+chihiro+1080&c=0_0&f=0" + download_path: "/home/jojo/Videos/Kono Subarashii Sekai ni Bakuen wo!" + - url: "https://nyaa.si/?page=rss&q=one+turn+kill+nee-san+1080+erai&c=1_2&f=0" + download_path: "/home/jojo/Videos/Isekai One Turn Kill Nee-san" + regexp: ^((?!HEVC).)*$ + - url: "https://nyaa.si/?page=rss&q=Isekai+Shoukan+wa+Nidome+desu+1080+erai&c=1_2&f=0" + download_path: "/home/jojo/Videos/Isekai Shoukan wa Nidome Desu" + regexp: ^((?!HEVC).)*$ + - url: "https://nyaa.si/?page=rss&q=Tensei+Kizoku+no+Isekai+Boukenroku+1080+erai&c=1_2&f=0" + download_path: "/home/jojo/Videos/Tensei Kizoku no Isekai Boukenroku - Jichou o Shiranai Kamigami no Shito" + regexp: ^((?!HEVC).)*$ + - url: "https://nyaa.si/?page=rss&q=magical+destroyers+erai+1080&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/home/jojo/Videos/Mahou Shoujo Magical Destroyers" + - url: "https://nyaa.si/?page=rss&q=Edomae+Elf+1080+erai&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/home/jojo/Videos/Edomae Elf" + - url: "https://nyaa.si/?page=rss&q=rom+Isekai+wa+Smartphone+%222+-%22&c=0_0&f=0" + download_path: "/media/sakura/jojo/Videos/Isekai wa Smartphone to Tomo ni 2" + - url: "https://nyaa.si/?page=rss&q=vending+machine+judas&c=0_0&f=0" + download_path: "/media/sakura/jojo/Videos/Reborn as a Vending Machine, I Now Wander the Dungeon" + - url: "https://nyaa.si/?page=rss&q=Mushoku+Tensei+Jobless+Reincarnation+S2+mtbb&c=1_2&f=0" + download_path: "/media/sakura/jojo/Videos/Mushoku Tensei Jobless Reincarnation" + - url: "https://nyaa.si/?page=rss&q=+Level+1+Dakedo+Unique+Skill+de+Saikyou+Desu+erai+1080&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Level 1 Dakedo Unique Skill de Saikyou Desu" + - url: "https://nyaa.si/?page=rss&q=helck+1080+subsplease&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Helck" + - url: "https://nyaa.si/?page=rss&q=wrathmonth+lastame&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/The Most Heretical Last Boss Queen: From Villainess to Savior" + - url: "https://nyaa.si/?page=rss&q=Shinigami+Bocchan+to+Kuro+Maid+2nd+1080+&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Shinigami Bocchan to Kuro Maid 2" + - url: "https://nyaa.si/?page=rss&q=Lv1+Maou+to+One+Room+Yuusha+1080+erai&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Lv1 Maou to One Room Yuusha" + - url: "https://nyaa.si/?page=rss&q=shangri+la+frontier+1080+erai&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Shangri-La Frontier" + - url: "https://nyaa.si/?page=rss&q=Toaru+Ossan+erai+1080&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Toaru Ossan no VRMMO Katsudou Ki" + - url: "https://nyaa.si/?page=rss&q=Dekoboko+Majo+no+Oyako+Jijou+erai+1080&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Dekoboko Majo no Oyako Jijou" + - url: "https://nyaa.si/?page=rss&q=potion+danomi+erai+1080&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Potion-danomi de Ikinobimasu!" + - url: "https://nyaa.si/?page=rss&q=Hyakkano+1080+erai&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Hyakkano" + - url: "https://nyaa.si/?page=rss&q=Tearmoon+1080+erai&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Tearmoon Teikoku Monogatari" + - url: "https://nyaa.si/?page=rss&q=undead+unluck+1080+breeze&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Undead Unluck" + - url: "https://nyaa.si/?page=rss&q=Watashi+no+Oshi+wa+Akuyaku+Reijou+erai+1080&c=0_0&f=0" + regexp: ^((?!v0).)*$ + download_path: "/media/sakura/jojo/Videos/Watashi no Oshi wa Akuyaku Reijou" + - url: "https://nyaa.si/?page=rss&q=Kikansha+no+Mahou+wa+Tokubetsu+desu+erai+1080&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Kikansha no Mahou wa Tokubetsu Desu" + - url: "https://nyaa.si/?page=rss&q=Saihate+no+Paladin%3A+Tetsusabi+no+Yama+no+Ou+erai+1080&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Saihate no Paladin - Tetsusabi no Yama no Ou" + - url: "https://nyaa.si/?page=rss&q=dark+gathering+elainaya&c=1_2&f=0" + download_path: "/media/sakura/jojo/Videos/Dark Gathering" + - url: "https://nyaa.si/?page=rss&q=buta+no+liver+erai+1080&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Buta no Liver wa Kanetsu Shiro" + - url: "https://nyaa.si/?page=rss&q=kamierabi+1080+erai&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Kamierabi" + - url: "https://nyaa.si/?page=rss&q=spy+x+family+season+2+1080+erai&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Spy x Family Season 2" + - url: "https://nyaa.si/?page=rss&q=Ikenaikyo+1080+erai&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Ikenaikyo" + - url: "https://nyaa.si/?page=rss&q=Yuzuki-san+Chi+no+Yonkyoudai+1080+subsplease+1080&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Yuzuki-san Chi no Yonkyoudai" + - url: "https://nyaa.si/?page=rss&q=Boushoku+no+Berserk+1080+erai&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Boushoku no Berserk" + - url: "https://nyaa.si/?page=rss&q=Hikikomari+Kyuuketsuki+no+Monmon+chihiro&c=0_0&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Hikikomari Kyuuketsuki no Monmon" + - url: "https://nyaa.si/?page=rss&q=Nozomanu+Fushi+no+Boukensha+1080+erai&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Nozomanu Fushi no Boukensha" + - url: "https://nyaa.si/?page=rss&q=Sasaki+to+Pii-chan+1080+subsplease&c=1_2&f=0" + regexp: ^((?!HEVC).)*$ + download_path: "/media/sakura/jojo/Videos/Sasaki to Pii-chan" diff --git a/script/bin/album.sh b/script/bin/album.sh new file mode 100755 index 0000000..8834bf9 --- /dev/null +++ b/script/bin/album.sh @@ -0,0 +1,5 @@ +#!/bin/sh + +find . -maxdepth 1 -type d | while read -r i;do + find "$i" -maxdepth 1 -iregex '.*\.\(jpg\|png\)' | sort | head -n1 +done | sxiv -qito | cut -d'/' -f2 | xargs -rI{} sxiv -qr {} &>/dev/null diff --git a/script/bin/bspwm_resize b/script/bin/bspwm_resize new file mode 100755 index 0000000..8310eba --- /dev/null +++ b/script/bin/bspwm_resize @@ -0,0 +1,23 @@ +#!/usr/bin/env dash +# +# easier resizing with bspwm +# +# wm key bindings + +# set step +if bspc query -N -n focused.floating > /dev/null; then + step=20 +else + step=100 +fi + +case "$1" in + west) dir=right; falldir=left; x="-$step"; y=0;; + east) dir=right; falldir=left; x="$step"; y=0;; + north) dir=top; falldir=bottom; x=0; y="-$step";; + south) dir=top; falldir=bottom; x=0; y="$step";; +esac + +bspc node -z "$dir" "$x" "$y" || bspc node -z "$falldir" "$x" "$y" + +# vim: ft=sh diff --git a/script/bin/bspwmrc b/script/bin/bspwmrc new file mode 100755 index 0000000..bafd4ec --- /dev/null +++ b/script/bin/bspwmrc @@ -0,0 +1,13 @@ +#!/usr/bin/env sh + +# source the colors. +. "${HOME}/.cache/wal/colors.sh" + +# Set the border colors. +bspc config normal_border_color "$color1" +bspc config active_border_color "$color2" +bspc config focused_border_color "$color15" +# Use the line below if you are on bspwm >= 0.9.4 +bspc config presel_feedback_color "$color1" + +cd "$HOME/.cache/wal" && plasma-theme -c MoeDarkCustom.colors -w qt5ct-style || exit diff --git a/script/bin/dmenu b/script/bin/dmenu new file mode 100755 index 0000000..1d793f0 --- /dev/null +++ b/script/bin/dmenu @@ -0,0 +1,3 @@ +#!/usr/bin/env sh + +rofi -dmenu -fullscreen -p "󰮫 Menu" "$1" diff --git a/script/bin/epub-thumbnailer b/script/bin/epub-thumbnailer new file mode 100755 index 0000000..58f2667 --- /dev/null +++ b/script/bin/epub-thumbnailer @@ -0,0 +1,127 @@ +#!/usr/bin/python + +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program. If not, see . + +# Author: Mariano Simone (http://marianosimone.com) +# Version: 1.0 +# Name: epub-thumbnailer +# Description: An implementation of a cover thumbnailer for epub files +# Installation: see README + +import os +import re +from io import BytesIO +import sys +from xml.dom import minidom + +try: + from urllib.request import urlopen +except ImportError: # Python 2 + from urllib import urlopen + +import zipfile +try: + from PIL import Image +except ImportError: + import Image + +img_ext_regex = re.compile(r'^.*\.(jpg|jpeg|png)$', flags=re.IGNORECASE) +cover_regex = re.compile(r'.*cover.*\.(jpg|jpeg|png)', flags=re.IGNORECASE) + +def get_cover_from_manifest(epub): + + # open the main container + container = epub.open("META-INF/container.xml") + container_root = minidom.parseString(container.read()) + + # locate the rootfile + elem = container_root.getElementsByTagName("rootfile")[0] + rootfile_path = elem.getAttribute("full-path") + + # open the rootfile + rootfile = epub.open(rootfile_path) + rootfile_root = minidom.parseString(rootfile.read()) + + # find possible cover in meta + cover_id = None + for meta in rootfile_root.getElementsByTagName("meta"): + if meta.getAttribute("name") == "cover": + cover_id = meta.getAttribute("content") + break + + # find the manifest element + manifest = rootfile_root.getElementsByTagName("manifest")[0] + for item in manifest.getElementsByTagName("item"): + item_id = item.getAttribute("id") + item_properties = item.getAttribute("properties") + item_href = item.getAttribute("href") + item_href_is_image = img_ext_regex.match(item_href.lower()) + item_id_might_be_cover = item_id == cover_id or ('cover' in item_id and item_href_is_image) + item_properties_might_be_cover = item_properties == cover_id or ('cover' in item_properties and item_href_is_image) + if item_id_might_be_cover or item_properties_might_be_cover: + return os.path.join(os.path.dirname(rootfile_path), item_href) + + return None + +def get_cover_by_filename(epub): + no_matching_images = [] + for fileinfo in epub.filelist: + if cover_regex.match(fileinfo.filename): + return fileinfo.filename + if img_ext_regex.match(fileinfo.filename): + no_matching_images.append(fileinfo) + return _choose_best_image(no_matching_images) + +def _choose_best_image(images): + if images: + return max(images, key=lambda f: f.file_size) + return None + +def extract_cover(cover_path): + if cover_path: + cover = epub.open(cover_path) + im = Image.open(BytesIO(cover.read())) + im.thumbnail((size, size), Image.ANTIALIAS) + if im.mode == "CMYK": + im = im.convert("RGB") + im.save(output_file, "PNG") + return True + return False + +# Which file are we working with? +input_file = sys.argv[1] +# Where do does the file have to be saved? +output_file = sys.argv[2] +# Required size? +size = int(sys.argv[3]) + +# An epub is just a zip +if os.path.isfile(input_file): + file_url = open(input_file, "rb") +else: + file_url = urlopen(input_file) + +epub = zipfile.ZipFile(BytesIO(file_url.read()), "r") + +extraction_strategies = [get_cover_from_manifest, get_cover_by_filename] + +for strategy in extraction_strategies: + try: + cover_path = strategy(epub) + if extract_cover(cover_path): + exit(0) + except Exception as ex: + print("Error getting cover using %s: " % strategy.__name__, ex) + +exit(1) diff --git a/script/bin/mixer b/script/bin/mixer new file mode 100755 index 0000000..e9b6960 --- /dev/null +++ b/script/bin/mixer @@ -0,0 +1,202 @@ +#!/usr/bin/env sh + +########################################### +# Displays audio sinks and control volume # +########################################### + +sink="$HOME/.cache/mixer/sink" + +# list options +help() { + echo "Usage: mixer COMMAND [OPTION] - Display audio sinks and control volume + +  listen [monitor events and display current sink volume] + ├── --color=color2 [xrdb foreground color] + └── --volume-icons=\"奄,奔,墳, \" [comma separated list of icons] +  update {+,-}1% [update current sink volume] +  switch [switch to the next sink] +  --help, -h [this help page] + 懶 toggle [toggle between play and pause] + 玲 prev [play previous song] + 怜 next [play next song] + 栗 stop [stop playing] +  position [position in percent] + " + #  restore [restore saved configuration] +} + +# return selected color generated by pywal +get_color() { + grep -o "$1.*" "$HOME/.cache/wal/colors.sh" | sed "s/$1='\(.*\)'.*/\1/" +} + +# display volume icon +# @param: volume between 1 and 100, normalized_volume otherwise +volume_icon() { + volume=${1:-$(normalized_volume)} + len_icons=$(echo "$volume_icons" | wc -l) + for i in $(seq 1 "$len_icons"); do + if [ "$(echo "$i * (100/$len_icons) + 1" | bc -l | xargs printf "%0.f\n" )" -ge "${volume}" ]; then + echo "$volume_icons" | sed "$i!d" + break + fi + done +} + +# return current volume associated with current sink +current_volume() { + playerctl --player="$(current_sink)" volume +} + +# print current sink +current_sink() { + cat "$sink" +} + +# return volume between 0 and 100% +# @param: volume between 0 and 1.0, current_volume otherwise +normalized_volume() { + volume=${1:-$(current_volume)} + echo "${volume} * 100" | bc -l | xargs printf "%0.f\n" +} + +# save sinks with volumes +# save() { +# aucatctl | tr '\n' ' ' > "$save" +# } + +# update volume with increment of value +# value between 0..130 +# increment +n or -n +update() { + operand=$(echo "$1" | grep -o '+\|-') + value=$(echo "$1" | grep -o '[[:digit:]]*') + volume=$(normalized_volume) + { [ "$volume" -eq 0 ] && [ "$operand" = "-" ]; } || { [ "$volume" -eq 130 ] && [ "$operand" = "+" ]; } && return + # sndioctl "$(current_sink).level=$operand$(echo "scale=2;$value/100" | bc -l)" + playerctl --player="$(current_sink)" volume "$(echo "scale=2;$value/100" | bc -l)$operand" +} + +# automatically set current sink to last modified +auto_switch_sink() { + new_sink="$(echo "$1" | cut -f 1 -d ' ')" + [ "$new_sink" = '' ] && return + [ "$new_sink" = 'No players were found' ] && return + [ "$new_sink" = "$(current_sink)" ] || echo "$new_sink" > "$sink" +} + +mpris() { + while true; do + player_status=$(playerctl status 2> /dev/null) + if [ "$player_status" = "Playing" ]; then + volume=$(playerctl status --format '{{volume}}') + player=$(playerctl status --format '{{playerName}}') + normalized_volume=$(normalized_volume "$volume") + echo "$player %{F$color}$(volume_icon "$normalized_volume")%{F-} ${normalized_volume}%" + sleep 1 + fi + done +} + +# listen on sndiod new events and sink change +listen() { + # on separated thread listen to playerctl events + { + playerctl --all-players --follow --format '{{playerName}} {{volume}}' status 2> /dev/null | while read -r MSG; do + auto_switch_sink "$MSG" + display + done + } & + # watch for current sink value stored in file change + while inotifywait -q -q -e close_write "$sink"; do + display + done +} + +# display sink and associated volume in polybar +display() { + echo "$(current_sink) %{F$color}$(volume_icon)%{F-} $(normalized_volume)%" +} + +# switch to the next available sink +switch() { + sinks=$(playerctl -l | cut -f 1 -d '.') + max_index=$(echo "$sinks" | wc -l) + current_index=$(echo "$sinks" | grep -n "$(current_sink)" | cut -f 1 -d ':') + next_index=$(echo "$current_index%$max_index + 1" | bc) + echo "$sinks" | sed "$next_index!d" | cut -f 1 -d '=' | sed 's/.level//' > "$sink" +} + +# restore last saved volume per sink +# restore() { +# [ -f "$save" ] && aucatctl "$(cat "$save")" +# } + +is_mpd_sink() { + [ "$(current_sink | grep -o 'mpd')" = "mpd" ] && echo "true" || echo "false" +} + +position() { + [ "$(is_mpd_sink)" = "true" ] && mpc status | grep -oP "\(\K[^(].*(?=%)" +} + +toggle() { + playerctl --player="$(current_sink)" play-pause + eww open cover + eww open progress-bar +} + +prev() { + playerctl --player="$(current_sink)" previous + "$HOME/.config/ncmpcpp/art.sh" +} + +next() { + playerctl --player="$(current_sink)" next + "$HOME/.config/ncmpcpp/art.sh" +} + +stop() { + playerctl --player="$(current_sink)" stop + eww close cover + eww close progress-bar +} + +main() { + [ ! -f "$sink" ] && mkdir -p "$HOME/.cache/mixer" && echo "output" > "$sink" + color=$(get_color 'color2') + volume_icons="奄\n奔\n墳\n" + case "$1" in + listen) + case "$2" in + --color=?*) + case "$3" in + --volume-icons=?*) + volume_icons=$(echo "${3#*=}" | tr ',' '\n') + esac + color=$(get_color "${2#*=}");; + esac + listen;; + mpris) + mpris;; + update) + shift; + update "$@";; + switch) + switch;; + prev) + prev;; + next) + next;; + toggle) + toggle;; + stop) + stop;; + position) + position;; + --help|-h|*) + help;; + esac +} + +main "$@" diff --git a/script/bin/mount_sailfish b/script/bin/mount_sailfish new file mode 100755 index 0000000..8398632 --- /dev/null +++ b/script/bin/mount_sailfish @@ -0,0 +1,11 @@ +#!/usr/bin/env sh + +mount() { + sshfs -o uid=1000 -o gid=1000 "$1:/home/defaultuser" "$HOME/mnt/sailfish/internal" + sshfs -o uid=1000 -o gid=1000 "$1:/media/ebbfe37f-2979-4239-b5e0-725872f38289/Music" "$HOME/mnt/sailfish/sdcard" +} + +interface="${1:-wifi}" + +[ "$interface" = "wifi" ] && sailfish="sailfish-x" || sailfish="sailfish-wired" +mount "$sailfish" diff --git a/script/bin/pidswallow b/script/bin/pidswallow new file mode 100755 index 0000000..71feaa8 --- /dev/null +++ b/script/bin/pidswallow @@ -0,0 +1,234 @@ +#!/bin/sh +usage="pidswallow (pid swallow WM/DE independent) +Hides terminal window automatically, so that you don't have to + +pidswallow [OPTION ...] + +OPTIONS: + -h --help Show this message + -s --swallow Hides parent window of the given child window id. + -v --vomit Unhides parent window of the given child window id. + -t --toggle toggle between swallow and vomit. (default) + -g --glue treat if parent and child window are same. (recommended) + -l --loop listen and hide / unhide window on launch / remove. + -V --verbose Shows useful information. + +bugs/issues: https://github.com/liupold/pidswallow. +" +shell=" ${PIDSWALLOW_SHELL:-" ${SHELL##*/} "} " +terminal=" ${PIDSWALLOW_TERMINAL:-" $TERMINAL "} " +blacklist=" ${PIDSWALLOW_BLACKLIST:-" $terminal "} " +glue_blacklist=" $PIDSWALLOW_GLUE_BLACKLIST " +swallow_command="${PIDSWALLOW_SWALLOW_COMMAND:-xdo hide \$pwid}" +vomit_command="${PIDSWALLOW_VOMIT_COMMAND:-xdo show \$pwid}" +preglue_hook="$PIDSWALLOW_PREGLUE_HOOK" + +verbose=0 +glue=0 + +vecho() { + [ "$verbose" -eq 1 ] && echo "$@" | paste -s -d ' ' +} + +vomit() { + unset cwid pwid x y w h # similar to local + cwid=$(printf '0x%x' "$1") # hexadecimal conversion + [ -f "/tmp/swallowed-by-$cwid" ] && read -r pwid < "/tmp/swallowed-by-$cwid" + [ -n "$pwid" ] || return 1 + vecho "vomit - $cwid vomiting $pwid using $vomit_command" + echo "pwid=$pwid;cwid=$cwid;" "$vomit_command" | /bin/sh + + + vecho "vomit - $cwid vomited $pwid" + rm "/tmp/swallowed-by-$cwid" + + if xwininfo -id "$cwid" >/dev/null 2>&1; then + xdo activate "$cwid" # if child still exists, re-focus it + else + xdo activate "$pwid" + fi + + if [ "$glue" -eq 1 ] && [ "${glue_blacklist#* $cname}" = "$glue_blacklist" ]; + then + [ -f "/tmp/swallowed-by-$cwid-structure" ] && { + read -r structure < "/tmp/swallowed-by-$cwid-structure" + structure="${structure#*\(}"; x="${structure%%,*}" + structure="${structure#*,}"; y="${structure%%)*}" + structure="${structure#*width }"; w="${structure%%,*}" + h="${structure#*height }" + xdo resize -w "$w" -h "$h" "$pwid" + xdo move -x "$x" -y "$y" "$pwid" + } + + [ -f "/tmp/swallowed-by-$cwid-desk" ] && { + read -r desk < "/tmp/swallowed-by-$cwid-desk" + desk="${desk##* }" + xdotool set_desktop_for_window "$pwid" "$desk" + } + fi + rm -f "/tmp/swallowed-by-$cwid-structure" "/tmp/swallowed-by-$cwid-desk" + +} + +swallow() { + # return values + # 0 -> Found and swallowed + # 3 -> window lacks a _NET_WM_PID property. + # 4 -> window already swallowed / not possible + # 5 -> swallow_command failed + unset cwid pwid cname pname ppid cpid x y w h # similar to local. + cwid=$(printf '0x%x' "$1") # hexadecimal conversion + [ -f "/tmp/swallowed-by-$cwid" ] && return 4 + cpid="$(xdo pid "$cwid")" || return 3 + cname="$(ps -p "$cpid" -o comm=)" + [ "${blacklist#* $cname }" != "$blacklist" ] && return 0 + process_tree="$(pstree -ATlsp "$cpid" \ + | sed -n -e 's|(|:|g' -e 's|)||g' \ + -e 's|---|\n|g' -e 's|-+-|\n|g' \ + -e 's/\n'"$cname"':'"$cpid"'.*//' -e '1p' | tac)" + vecho "swallow - Scanning process tree of $cname($cpid): $process_tree" + for parent in $process_tree; do + pname="${parent%%:*}" # ancestor name + ppid="${parent##*:}" + if [ "${shell#* $pname }" != "$shell" ] && [ -f "/tmp/term-wid-$ppid" ]; then + vecho "swallow - $pname($ppid) detected as shell" + read -r pwid < "/tmp/term-wid-$ppid" + break + elif [ "${terminal#* $pname}" != "$terminal" ]; then + vecho "swallow - $pname($ppid) detected as terminal (fallback)" + pwid=$(xdo id -p "$ppid" | { + read -r temp; echo "$temp" + } ) + break + fi + done + [ -z "$pwid" ] && return 4 + if [ "$glue" -eq 1 ]; then + vecho "swallow - Running preglue hook: $preglue_hook" + echo "pwid=$pwid;cwid=$cwid;" "$preglue_hook" | /bin/sh + fi + vecho "swallow - $cwid swallowing $pwid using $swallow_command" + echo "pwid=$pwid;cwid=$cwid;" "$swallow_command" | /bin/sh || return 5 + echo "$pwid" > "/tmp/swallowed-by-$cwid" + vecho "swallow - $cname ($cwid) swallowed $pname (or its terminal) ($pwid)" + + [ "$glue" -ne 1 ] ||\ + [ "${glue_blacklist#* $cname}" != "$glue_blacklist" ] && return 0 + + + pgeo=$(xwininfo -shape -id "$pwid" | tr -d '\n ') + x="${pgeo##*Absoluteupper-leftX:}"; x="${x%%Absoluteupper-leftY:*}" + y="${pgeo##*Absoluteupper-leftY:}"; y="${y%%Relativeupper-leftX:*}" + w="${pgeo##*Width:}"; w="${w%%Height:*}" + h="${pgeo##*Height:}"; h="${h%%Depth:*}" + + xdo resize -w "$w" -h "$h" "$cwid" + xdo move -x "$x" -y "$y" "$cwid" + echo "event ($x,$y), width $w, height $h" \ + > "/tmp/swallowed-by-$cwid-structure" + xprop -notype -id "$cwid" _NET_WM_DESKTOP > "/tmp/swallowed-by-$cwid-desk" + # subscribe to window + { + xev -id "$cwid" -event structure -event property | while read -r event ; do + [ "${event#*DestroyNotify}" != "$event" ] && pkill -s 0 -f "xev.*$cwid" + [ "${event#* width }" != "$event" ] \ + && echo "$event" > "/tmp/swallowed-by-$cwid-structure" + [ "${event#*_NET_WM_DESKTOP}" != "$event" ] \ + && xprop -notype -id "$cwid" _NET_WM_DESKTOP \ + > "/tmp/swallowed-by-$cwid-desk" + done + } & +} + +toggle() { + cwid=$(printf '0x%x' "$1") # hexadecimal conversion + if [ -f "/tmp/swallowed-by-$cwid" ]; then + vomit "$cwid" + return "$?" + else + glue_="$glue" && \ + glue=0 && swallow "$cwid" && glue="$glue_" # overwrite here. + return "$?" + fi +} + +loop() { + prev_event="$(xprop -root _NET_CLIENT_LIST)" + xprop -spy -root _NET_CLIENT_LIST | while read -r event; do + unset node_added node_removed + for wid in $(echo "${event##*# }" | tr -d ','); do + [ "${prev_event#*$wid}" = "$prev_event" ] \ + && node_added="$wid" && break + done + for wid in $(echo "${prev_event##*# }" | tr -d ','); do + [ "${event#*$wid}" = "$event" ] \ + && node_removed="$wid" && break + done + prev_event="$event" + [ -n "$node_added" ] && swallow "$node_added" + [ -n "$node_removed" ] && { + xprop -id "$node_removed" >/dev/null 2>&1 || vomit "$node_removed" + } + done + return 1 +} + +[ -p /dev/stdin ] && eval set -- "$* $(cat /dev/stdin)" # basic pipe support +[ "$#" -eq 0 ] && echo "$usage" && exit 1 + +TEMP=$(getopt -o 'Vghlt:s:v:' --long 'verbose,glue,help,loop,toggle:,swallow:,vomit:' \ + -n 'pidswallow' -- "$@") + +# precheck +eval set -- "${TEMP}" +while true; do + case "$1" in + '-V'|'--verbose') + verbose=1 + vecho "shell: \"$shell\"" + vecho "terminal: \"$terminal\"" + shift; continue;; + '-g'|'--glue') + glue=1 + shift; continue;; + '--') + shift; break;; + *) + shift; continue;; + esac +done + +eval set -- "${TEMP}"; unset TEMP +while true; do + case "$1" in + '-V'|'--verbose') + shift; continue;; + '-g'|'--glue') + shift; continue;; + '-h' | '--help' ) + echo "$usage" && exit 0;; + '-t'|'--toggle') + toggle "$2" || exit "$?" + shift 2; continue;; + '-s'|'--swallow') + swallow "$2" || exit "$?" + shift 2; continue;; + '-v'|'--vomit') + vomit "$2" || exit "$?" + shift 2; continue;; + '-l'|'--loop') + loop || exit "$?" + shift; continue;; + '--') + shift; break;; + *) + echo "Internal error!" >&2 + echo "$usage" && exit 1;; + esac +done +# toggle WID on first non-flag argument +[ -n "$*" ] && toggle "$1" && shift +# error if there's more than one non-flag argument +if [ -n "$*" ]; then + echo "Unrecognized trailing option '$*'" >&2; exit 1 +fi diff --git a/script/bin/rounded_borders.sh b/script/bin/rounded_borders.sh new file mode 100755 index 0000000..79cfe3d --- /dev/null +++ b/script/bin/rounded_borders.sh @@ -0,0 +1,17 @@ +#!/usr/bin/env sh + +SOURCE="$1" +OUTPUT="$HOME/.config/feh/wallpaper.png" +BORDER_RADIUS=10 + +rounded_corners() { + convert -quiet "$SOURCE" -resize 1920x1080^ -gravity center -crop 1920x1080+0+0 +repage "$OUTPUT" + convert -quiet "$OUTPUT" \ + \( +clone -crop $((BORDER_RADIUS+1))x$((BORDER_RADIUS+1))+0+0 -fill white -colorize 100% \ + -draw "fill black circle $BORDER_RADIUS,$BORDER_RADIUS $BORDER_RADIUS,0" \ + -background black -alpha shape \ + \( +clone -flip \) \( +clone -flop \) \( +clone -flip \) \ + \) -flatten "$OUTPUT" +} + +rounded_corners && feh --bg-fill "$OUTPUT" diff --git a/script/bin/transmission-rss b/script/bin/transmission-rss new file mode 100755 index 0000000..4aa9cf7 --- /dev/null +++ b/script/bin/transmission-rss @@ -0,0 +1,7 @@ +#!/usr/bin/env sh + +#podman run -d --name transmission-rss --restart=always --network=host \ +# -v "$HOME/Videos/transmission-rss.conf:/etc/transmission-rss.conf" \ +# docker.io/nning2/transmission-rss:latest + +podman start transmission-rss diff --git a/script/bin/update-greasemonkey-filter b/script/bin/update-greasemonkey-filter new file mode 100755 index 0000000..f96fa0c --- /dev/null +++ b/script/bin/update-greasemonkey-filter @@ -0,0 +1,8 @@ +#!/usr/bin/env sh + +cd "$HOME/bin/src/jhide" || exit + +[ -f "$HOME/.local/share/qutebrowser/greasemonkey/jhide.js" ] && rm ~/.local/share/qutebrowser/greasemonkey/jhide.js +./jhide.sh ~/.config/qutebrowser/my-filters.txt -o ~/.local/share/qutebrowser/greasemonkey/jhide.js + +echo "Hidden elements updated. Run :greasemonkey-reload to take effect." diff --git a/script/bin/wallpaper b/script/bin/wallpaper new file mode 100755 index 0000000..836bc06 --- /dev/null +++ b/script/bin/wallpaper @@ -0,0 +1,7 @@ +#!/usr/bin/env sh + +WALLPAPER="$1" + +wal -i "$WALLPAPER" -o "$HOME/bin/bspwmrc" -q +# "$HOME/bin/rounded_borders.sh" "$WALLPAPER" + diff --git a/terminal/.config/feh/wallpaper.png b/terminal/.config/feh/wallpaper.png index 262589f9a5bdd4eefc50bb94a046f0a0e9e1c565..e03c95855afa0c99297eb4297fe7cbb07b44baad 100644 GIT binary patch delta 614 zcmY+ANmtDQ07p&9kRc>fMDirV-+P8UbG?U>$UMtDWXO%oRNN?2rk+{m=^f`-_zoRA zAHcf3g>&q@ZNGEw=AOIyb+&v@>rByFot}{$`cvS)2Bf?6ke<>@(xkVfOCRYg{iMHS z$N(8AgJiH|$`BbU!z4?FOSX)Vkupj~%NWU#u`*6_WxPy~Jeer@GD$)*Sqfx|6v|YY zCevkx1Ts^?5|LRlTjt1IDUx{-mHDzj7Rn-7EK6jm6ibQ3BreNjxvY>*2@OjD4S%nY>}<9O}5Jp*(tlEN_NX0*(>{GzZ{T*a!3x#5vi7=a!iiP z38|5jl6tjPPRVJhlQVKw&dGVXAQ$D5T$U?RFAdTtSLK>0O>$jsNVBxaO}Qnv<&NBy zR=Fql<$*kuN75zyR2=h%4Le&^iHJ$Lo%Z2q3qnV_{QIi)Z=t@>YG1JYA^NpI;RNzzx6rJwYd0g@sE zWsnS(Au?1_B~6A&x(t^QGEzp#Xc;48Wt?Qlc$pxXGEpW;mQ0pxnIbtdRi?>w$(0#0 zQ)bC*2_#SENWRRK0+}ZvnJ(?OC99=e z*2r2}C+lT{Y?Mv1S+>Yl*(Td%hwPMHvRn2@g;dI3*(dwufE<)Va#)VYQK^z+a$HVG zwVaewl6bX7PRkiNE9d0AT#$=WD|J#Ym*lcskp^j$t8z`0Cb=#*br-d-)(A<&(6_XZa#ue-N*Uq~?VS yLgD;SZV-fnpyO9%d#o!G&+M*$w){?y