URI: 
       annna-add-hashtag - annna - Annna the nice friendly bot.
  HTML git clone git://bitreich.org/annna/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/annna/
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
       ---
       annna-add-hashtag (9548B)
       ---
            1 #!/bin/sh
            2 
            3 export PATH="/home/annna/bin:$PATH"
            4 
            5 memecachedir="/br/gopher/memecache"
            6 hashtagdb="/home/annna/bin/modules/hashtags/hashtags.txt"
            7 unprocessed="/home/annna/bin/modules/hashtags/unprocessed.txt"
            8 memeindex="/br/gopher/memecache/index.meme"
            9 
           10 [ ! -e "${hashtagdb}" ] && touch "${hashtagdb}"
           11 
           12 dltag() {
           13         tag="$1"
           14         uri="$2"
           15 
           16         grep "${tag} " $hashtagdb >/dev/null
           17         if [ $? -eq 0 ];
           18         then
           19                 printf "tag '%s' already in db.\n" "${tag}" >&2
           20                 printf "%s %s\n" "${tag}" "${uri}" >> "${unprocessed}"
           21                 return 1
           22         fi
           23         stag="$(printf "${tag}\n" | cut -c 2-)"
           24 
           25         cd "${memecachedir}"
           26         error=0
           27         case "$uri" in
           28 *4chan.org*|\
           29 *afreecatv.com*|\
           30 *artstation.com*|\
           31 *asiansister.com*|\
           32 *asmhentai.com*|\
           33 *avgle.com*|\
           34 *bandcamp.com*|\
           35 *baraag.net*|\
           36 *bcy.net*|\
           37 *bdsmlr.com*|\
           38 *bilibili.com*|\
           39 *comic-walker.com*|\
           40 *coub.com*|\
           41 *danbooru.donmai.us*|\
           42 *dropbox.com*|\
           43 *dumpert.nl*|\
           44 *webtoon.kakao.com*|\
           45 *deviantart.com*|\
           46 *e-hentai.org*|\
           47 *exhentai.org*|\
           48 *facebook.com*|\
           49 *video.fc2.com*|\
           50 *flickr.com*|\
           51 *gelbooru.com*|\
           52 *syosetu.org*|\
           53 *hanime.tv*|\
           54 *hentai-foundry.com*|\
           55 *hitomi.la*|\
           56 *hiyobi.me*|\
           57 *instagram.com*|\
           58 *iwara.tv*|\
           59 *ecchi.iwara.tv*|\
           60 *jmana.net*|\
           61 *kakuyomu.jp*|\
           62 *loveheaven.net*|\
           63 *likee.video*|\
           64 *luscious.net*|\
           65 *myreadingmanga.info*|\
           66 *blog.naver.com*|\
           67 *cafe.naver.com*|\
           68 *post.naver.com*|\
           69 *comic.naver.com*|\
           70 *tv.naver.com*|\
           71 *nhentai.net*|\
           72 *nhentai.com*|\
           73 *nicovideo.jp*|\
           74 *nijie.info*|\
           75 *nozomi.la*|\
           76 *pawoo.net*|\
           77 *pinterest.com*|\
           78 *pixiv.net*|\
           79 *comic.pixiv.net*|\
           80 *pornhub.com*|\
           81 *pornhubpremium.com*|\
           82 *rule34.xxx*|\
           83 *www.sankakucomplex.com*|\
           84 *chan.sankakucomplex.com*|\
           85 *idol.sankakucomplex.com*|\
           86 *soundcloud.com*|\
           87 *syosetu.com*|\
           88 *tokyomotion.net*|\
           89 *tumblr.com*|\
           90 *twitch.tv*|\
           91 *twitter.com*|\
           92 *vimeo.com*|\
           93 *vlive.tv*|\
           94 *archive.org*|\
           95 *weibo.com*|\
           96 *www.wikiart.org*|\
           97 *xhamster.com*|\
           98 *xnxx.com*|\
           99 *xvideos.com*|\
          100 *yande.re*|\
          101 *youku.com*|\
          102 *youtube.com*|\
          103 *youtu.be*|\
          104 *yewtu.be*|\
          105 *vimeo.com*|\
          106 *twitter.com*|\
          107 *reddit.com*|\
          108 *v.redd.it*|\
          109 *invidious*|\
          110 *gfycat.com*|\
          111 *xvideos.com*|\
          112 *youporn.com*|\
          113 *tiktok.com*|\
          114 *invidious-us.kavin.rocks*|\
          115 *vid.puffyan.us*|\
          116 *invidious.snopyta.org*|\
          117 *youtube.076.ne.jp*|\
          118 *inv.riverside.rocks*|\
          119 *yewtu.be*|\
          120 *invidio.xamh.de*|\
          121 *invidious.osi.kr*|\
          122 *invidious.namazso.eu*|\
          123 *inv.cthd.icu*|\
          124 *yt.artemislena.eu*|\
          125 *invidious.kavin.rocks*|\
          126 *dl.dropboxusercontent.com/*|\
          127 *dl-eu.dropboxusercontent.com*|\
          128 *.dl-eu.dropboxusercontent.com*|\
          129 *dl-au.dropboxusercontent.com*|\
          130 *.dl-au.dropboxusercontent.com*|\
          131 *dl-jp.dropboxusercontent.com*|\
          132 *.dl-jp.dropboxusercontent.com*|\
          133 *dl-uk.dropboxusercontent.com*|\
          134 *.dl-uk.dropboxusercontent.com*|\
          135 *dl.dropbox.com*|\
          136 *dl-eu.dropbox.com*|\
          137 *dl-au.dropbox.com*|\
          138 *dl-jp.dropbox.com*|\
          139 *dl-uk.dropbox.com*|\
          140 *dl-web.dropbox.co/*|\
          141 *dl-web-eu.dropbox.com*|\
          142 *dl-web-au.dropbox.com*|\
          143 *dl-web-jp.dropbox.com*|\
          144 *dl-web-uk.dropbox.com*|\
          145 *dl-client.dropbox.com/*|\
          146 *dl-doc.dropbox.com/*|\
          147 *dl-doc.dropboxusercontent.com/*|\
          148 *api-content.dropbox.com/*|\
          149 *api-content-eu.dropbox.com*|\
          150 *api-content1-eu.dropbox.com*|\
          151 *api-content-au.dropbox.com*|\
          152 *api-content1-au.dropbox.com*|\
          153 *api-content-jp.dropbox.com*|\
          154 *api-content1-jp.dropbox.com*|\
          155 *api-content-uk.dropbox.com*|\
          156 *api-content1-uk.dropbox.com*|\
          157 *content.dropboxapi.com/*|\
          158 *content-eu.dropboxapi.com*|\
          159 *content-au.dropboxapi.com*|\
          160 *content-jp.dropboxapi.com*|\
          161 *content-uk.dropboxapi.com*|\
          162 *api-content-photos.dropbox.com/*|\
          163 *files-eu.dropbox.com*|\
          164 *files-au.dropbox.com*|\
          165 *files-jp.dropbox.com*|\
          166 *files-uk.dropbox.com*|\
          167 *showbox-tr.dropbox.com/*|\
          168 *showbox-eu.dropbox.com*|\
          169 *showbox-au.dropbox.com*|\
          170 *showbox-jp.dropbox.com*|\
          171 *showbox-uk.dropbox.com*|\
          172 *photos.dropbox.com/*|\
          173 *photos-*.dropbox.com/*|\
          174 *dl-debug*.dropbox.com/*|\
          175 *bolt.dropbox.com/*|\
          176 *.dropbox.com/content_link/*|\
          177 *.dropbox.com/content_link_zip/*|\
          178 *.dropbox.com/content_link_htmlify/*|\
          179 *.dropbox.com/content_link_preview/*|\
          180 *.dropbox.com/link_token_dl/*|\
          181 *.dropbox.com/link_token_dl_zip/*|\
          182 *.dropbox.com/zip_collection/*|\
          183 *.dropbox.com/transcode_video/*|\
          184 *.dropbox.com/hls_transcode/*|\
          185 *.dropbox.com/t/*|\
          186 *.dropbox.com/u/|\
          187 *.dropbox.com/s/*|\
          188 *.dropbox.com/sh/*|\
          189 *.dropbox.com/sc/*|\
          190 *.dropbox.com/photos/album/*|\
          191 *.dropbox.com/photos/c/*|\
          192 *.dropbox.com/photos/cc/*|\
          193 *.dropbox.com/photos/cl/*|\
          194 *.dropbox.com/photos/cp/*|\
          195 *.dropbox.com/photos/conversation_add/*|\
          196 *.dropbox.com/photos/conversation_invite/*|\
          197 *.dropbox.com/photos/conversation_preview/*|\
          198 *.dropbox.com/photos/post/*|\
          199 *.dropbox.com/photos/c/permanent_collection_thumb/*|\
          200 *ext-twitch.tv*|\
          201 *jtvnw.net*|\
          202 *live-video.net*|\
          203 *ttvnw.net*|\
          204 *twitch.okta.com*|\
          205 *twitch.tv*|\
          206 *twitchcdn.net*|\
          207 *twitchsvc.net*|\
          208 *nitter.42l.fr*|\
          209 *nitter.pussthecat.org*|\
          210 *nitter.nixnet.services*|\
          211 *nitter.fdn.fr*|\
          212 *nitter.1d4.us*|\
          213 *nitter.kavin.rocks*|\
          214 *nitter.unixfox.eu*|\
          215 *nitter.domain.glass*|\
          216 *nitter.eu*|\
          217 *nitter.namazso.eu*|\
          218 *nitter.actionsack.com*|\
          219 *birdsite.xanny.family*|\
          220 *nitter.hu*|\
          221 *twitr.gq*|\
          222 *nitter.moomoo.me*|\
          223 *nittereu.moomoo.me*|\
          224 *bird.trom.tf*|\
          225 *nitter.it*|\
          226 *twitter.censors.us*|\
          227 *nitter.grimneko.de*|\
          228 *nitter.alefvanoon.xyz*|\
          229 *n.hyperborea.cloud*|\
          230 *nitter.ca*|\
          231 *twitter.076.ne.jp*|\
          232 *nitter.mstdn.social*|\
          233 *nitter.fly.dev*|\
          234 *notabird.site*|\
          235 *nitter.weiler.rocks*|\
          236 *nitter.silkky.cloud*|\
          237 *nitter.sethforprivacy.com*|\
          238 *nttr.stream*|\
          239 *nitter.cutelab.space*|\
          240 *nitter.nl*|\
          241 *nitter.mint.lgbt*|\
          242 *nitter.tokhmi.xyz*|\
          243 *nitter.bus-hit.me*|\
          244 *fuckthesacklers.network*|\
          245 *nitter.govt.land*|\
          246 *nitter.datatunnel.xyz*|\
          247 *nitter.esmailelbob.xyz*|\
          248 *tw.artemislena.eu*|\
          249 *ardmediathek.de*|\
          250 *nitter.eu.org*)
          251                 youtube-dl -o "${stag}.%(ext)s" "${uri}"
          252                 if [ $? -gt 0 ];
          253                 then
          254                         error=1
          255                         printf "youtube-dl tag '%s' had problems.\n" "${tag}" >&2
          256                         printf "%s %s\n" "${tag}" "${uri}" >> "${unprocessed}"
          257                 fi
          258                 ;;
          259         *)
          260                 ext="$(basename "${uri}" | sed 's/^.*\.//')"
          261                 curl -Lo "${stag}.${ext}" "${uri}"
          262                 if [ $? -gt 0 ];
          263                 then
          264                         error=1
          265                         printf "curl tag '%s' had problems.\n" "${tag}" >&2
          266                         printf "%s %s\n" "${tag}" "${uri}" >> "${unprocessed}"
          267                 fi
          268                 ;;
          269         esac
          270         if [ $error -eq 0 ];
          271         then
          272                 printf "tag '%s' downloaded.\n" "${tag}" >&2
          273                 printf "%s\n" "${uri}" > "${stag}.orig"
          274         fi
          275 
          276         return $error
          277 }
          278 
          279 processtag() {
          280         tag="$1"
          281         uri="$2"
          282 
          283         cd "${memecachedir}"
          284         tagfile="$(basename "$(find . -name "${stag}.*" | grep -v '\.orig$')")"
          285 
          286         # In case youtube-dl mangled with the extension, rename to what file
          287         # suggests us as ending.
          288         case "${tagfile}" in
          289         *.m3u8|*.M3U8)
          290                 realext="$(file --mime-type -b "${tagfile}" | cut -d'/' -f 2)"
          291                 if [ "${realext}" != "m3u8" ];
          292                 then
          293                         newtagfile="$(printf "%s\n" "${tagfile}" \
          294                                 | tr '[:upper:]' '[:lower:]' \
          295                                 | sed "s,m3u8,${realext},")"
          296                         printf "Renaming %s to %s.\n" "${tagfile}" "${newtagfile}"
          297                         mv "${tagfile}" "${newtagfile}"
          298                         tagfile="${newtagfile}"
          299                 fi
          300                 ;;
          301         esac
          302 
          303         tagfilenew="$(/br/bin/quinq-size "${tagfile}" </dev/null | sed 's/.* -> //')"
          304         if [ -e "${tagfilenew}" ] && [ $? -eq 0 ];
          305         then
          306                 mv "${tagfilenew}" "${tagfile}"
          307         fi
          308 
          309         case "${tagfile}" in
          310         *.MP4|*.mp4|*.MKV|*.mkv|*.webm|*.WEBM|*.mov|*.MOV)
          311                 printf "Making %s streamable by adding faststart.\n" "${tagfile}"
          312                 ffmpeg -i "${tagfile}" -c copy -movflags faststart "faststart_${tagfile}" </dev/null
          313                 mv "faststart_${tagfile}" "${tagfile}"
          314                 ;;
          315         esac
          316 }
          317 
          318 inserttag() {
          319         tag="$1"
          320         uri="$2"
          321         
          322         grep "${tag} " $hashtagdb >/dev/null
          323         if [ $? -eq 0 ];
          324         then
          325                 printf "tag '%s' already in db.\n" "${tag}" >&2
          326                 printf "%s %s\n" "${tag}" "${uri}" >> "${unprocessed}"
          327                 return 1
          328         fi
          329 
          330         stag="$(printf "${tag}\n" | cut -c 2-)"
          331         cd "${memecachedir}"
          332         tagfile="$(basename "$(find . -name "${stag}.*" | grep -v '\.orig$')")"
          333         tagtype="$(get-tagtype "${tagfile}")"
          334         memecacheuri="gophers://bitreich.org/${tagtype}/memecache/${tagfile}"
          335 
          336         printf "%s %s\n" "${tag}" "${memecacheuri}" >> "${hashtagdb}"
          337         printf "tag '%s' added as '%s' to hashtags db.\n" "${tag}" "${memecacheuri}" >&2
          338         LC_ALL=C sort -t ' ' -k1,1 "${hashtagdb}" > "${hashtagdb}.sort"
          339         mv "$hashtagdb.sort" "${hashtagdb}"
          340         # keep permissions shared.
          341         chown ':bitreich' "${hashtagdb}"
          342         chmod 664 "${hashtagdb}"
          343 }
          344 
          345 indextag() {
          346         tag="$1"
          347         uri="$2"
          348         
          349         grep "${tag} " $memeindex >/dev/null
          350         if [ $? -eq 0 ];
          351         then
          352                 printf "tag '%s' already in index.\n" "${tag}" >&2
          353                 return 1
          354         fi
          355 
          356         stag="$(printf "${tag}\n" | cut -c 2-)"
          357         cd "${memecachedir}"
          358         tagfile="$(basename "$(find . -name "${stag}.*" | grep -v '\.orig$')")"
          359         checksum="$(sha512sum "${tagfile}" | cut -d' ' -f 1)"
          360         tagtype="$(get-tagtype "${tagfile}")"
          361         memecacheuri="gophers://bitreich.org/${tagtype}/memecache/${tagfile}"
          362 
          363         printf "%s %s %s\n" "${tag}" "${memecacheuri}" "${checksum}" >> "${memeindex}"
          364         printf "tag '%s' added as '%s' to meme index.\n" "${tag}" "${memecacheuri}" >&2
          365         tail -n +2 "${memeindex}" | LC_ALL=C sort -t ' ' -k1,1 > "${memeindex}.sort"
          366 
          367         {
          368                 printf "meme2\n"
          369                 cat "${memeindex}.sort"
          370         } > "${memeindex}"
          371         rm "${memeindex}.sort"
          372         # keep permissions shared.
          373         chown ':bitreich' "${memeindex}"
          374         chmod 664 "${memeindex}"
          375 }
          376 
          377 addtag() {
          378         tag="$1"
          379         uri="$2"
          380 
          381         if printf '%s' "$1" | cut -c 2- | grep -qE "[# ',?!]";
          382         then
          383                 printf 'error: tag cannot contain the following characters: # '\'',?!\n' >&2
          384                 exit 1
          385         fi
          386 
          387         dltag "$1" "$2"
          388         [ $? -gt 0 ] && return
          389         processtag "$1" "$2"
          390         [ $? -gt 0 ] && return
          391         inserttag "$1" "$2"
          392         [ $? -gt 0 ] && return
          393         indextag "$1" "$2"
          394 }
          395 
          396 if [ $# -eq 2 ];
          397 then
          398         tag="$1"
          399         uri="$2"
          400 
          401         addtag "${tag}" "${uri}"
          402 else
          403         if [ $# -eq 1 ];
          404         then
          405                 [ -e "$1" ] && cat "$1" \
          406                 | while read -r tag uri;
          407                 do
          408                         addtag "${tag}" "${uri}"
          409                 done
          410         else
          411                 while read -r tag uri;
          412                 do
          413                         addtag "${tag}" "${uri}"
          414                 done
          415         fi
          416 fi