add rating parsing

This commit is contained in:
2023-02-19 13:40:19 -08:00
parent b1636d13b6
commit ea24542ea1
7 changed files with 4993 additions and 11 deletions

View File

@@ -103,7 +103,13 @@ class Domain::Fa::Parser::Page < Domain::Fa::Parser::Base
def probably_listings_page?
# center.flow seems to wrap all lists of submissions
@page.css("center.flow").first || @page.css("section.submission-list") ? true : false
case @page_version
when VERSION_0, VERSION_1
@page.css("center.flow").first || @page.css("section.submission-list") ? true : false
when VERSION_2
(@page.css(".submission-list").first || @page.css("#gallery-browse").first) ? true : false
else unimplemented_version!
end
end
def user_page
@@ -121,7 +127,13 @@ class Domain::Fa::Parser::Page < Domain::Fa::Parser::Base
def probably_submission?
# @page.css(".alt1.actions").first ? true : false
@page.css("#submissionImg").first ? true : false
case @page_version
when VERSION_0, VERSION_1
@page.css("#submissionImg").first ? true : false
when VERSION_2
@page.css(".submission-content").first ? true : false
else unimplemented_version!
end
end
def submission

View File

@@ -95,6 +95,22 @@ class Domain::Fa::Parser::SubmissionParserHelper < Domain::Fa::Parser::Base
end
end
def rating
case @page_version
when VERSION_2
if @elem.css(".rating-box.mature").first
:mature
elsif @elem.css(".rating-box.adult").first
:adult
elsif @elem.css(".rating-box.general").first
:general
else
raise("unable to determine rating")
end
else unimplemented_version!
end
end
def category
@category ||= case @page_version
when VERSION_0, VERSION_1

File diff suppressed because one or more lines are too long

File diff suppressed because it is too large Load Diff

View File

@@ -0,0 +1,995 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html lang="en" class="no-js" xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta charset="utf-8" />
<title>The Second Kind of Tarpit by CleverDerpy -- Fur Affinity [dot] net</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<meta name="description" content="Fur Affinity | For all things fluff, scaled, and feathered!" />
<meta name="keywords" content="fur furry furries fursuit fursuits cosplay brony bronies zootopia scalies kemono anthro anthropormophic art online gallery portfolio" />
<meta name="distribution" content="global" />
<meta name="copyright" content="Frost Dragon Art LLC" />
<meta name="robots" content="noai, noimageai" />
<link rel="icon" href="/themes/beta/img/favicon.ico" type="image/x-icon" />
<link rel="shortcut icon" href="/themes/beta/img/favicon.ico" type="image/x-icon" />
<link href="https://fonts.googleapis.com/css?family=Open+Sans:300,300i,400,400i,500,500i,600,600i,700,700i" rel="stylesheet">
<meta http-equiv="X-UA-Compatible" content="IE=9; IE=EDGE" />
<!-- og -->
<meta property="og:type" content="website" />
<meta property="og:title" content="The Second Kind of Tarpit by CleverDerpy" />
<meta property="og:url" content="https://www.furaffinity.net/view/51067352/" />
<meta property="og:description" content="Rosie Shaymin is going to be inside the massive balls of Tarryn, sirnopesalot112 &#039;s lovely Tarboi God!. Already enjoying the sensat ..." />
<meta property="og:image" content="https://www.furaffinity.net/themes/beta/img/banners/fa_logo.png?v2" />
<!-- twitter -->
<meta name="twitter:card" content="summary_large_image" />
<meta name="twitter:domain" content="furaffinity.net" />
<meta name="twitter:site" content="@furaffinity" />
<meta name="twitter:title" content="The Second Kind of Tarpit by CleverDerpy" />
<meta name="twitter:description" content="Rosie Shaymin is going to be inside the massive balls of Tarryn, sirnopesalot112 &#039;s lovely Tarboi God!. Already enjoying the sensat ..." />
<meta name="twitter:url" content="https://www.furaffinity.net/view/51067352/" />
<meta name="twitter:label1" content="Created On" />
<meta name="twitter:data1" content="February 18, 2023" />
<meta name="twitter:label2" content="Rating" />
<meta name="twitter:data2" content="Adult" />
<meta name="twitter:image" content="https://www.furaffinity.net/themes/beta/img/banners/fa_logo.png?v2" />
<script type="text/javascript">
var _faurl={d:'//d.furaffinity.net',a:'//a.furaffinity.net',r:'//rv.furaffinity.net',t:'//t.furaffinity.net',pb:'/themes/beta/js/prebid-6.13.0-fa.js'};
</script>
<script type="text/javascript" src="/themes/beta/js/common.js?u=2023011700"></script>
<link type="text/css" rel="stylesheet" href="/themes/beta/css/ui_theme_dark.css?u=2023011700" />
<!-- browser hints -->
<link rel="preconnect" href="//t.furaffinity.net" />
<link rel="preconnect" href="//a.furaffinity.net" />
<link rel="preconnect" href="//rv.furaffinity.net" />
<link rel="preconnect" href="https://www15.smartadserver.com" />
<link rel="preload" href="/themes/beta/js/prototype.1.7.3.min.js" as="script" />
<link rel="preload" href="/themes/beta/js/script.js?u=2023011700" as="script" />
</head>
<!-- EU request: no -->
<body data-static-path="/themes/beta" id="pageid-submission">
<!-- sidebar -->
<div class="mobile-navigation">
<div class="mobile-nav-container">
<div class="mobile-nav-container-item left">
<label for="mobile-menu-nav" class="css-menu-toggle only-one"><img class="burger-menu" src="/themes/beta/img/fa-burger-menu-icon.png"></label>
</div>
<div class="mobile-nav-container-item center"><a class="mobile-nav-logo" href="/"><img class="site-logo" src="/themes/beta/img/banners/fa_logo.png?v2"></a></div>
<div class="mobile-nav-container-item right">
</div>
</div>
<div class="nav-ac-container">
<input id="mobile-menu-nav" name="accordion-1" type="checkbox" />
<article class="nav-ac-content mobile-menu">
<div class="mobile-nav-content-container">
<div class="aligncenter">
<a href="/user/zzreg/"><img class="loggedin_user_avatar avatar" alt="zzreg" src="//a.furaffinity.net/1424255659/zzreg.gif"/></a>
<h2 style="margin-bottom:0"><a href="/user/zzreg/">zzreg</a></h2>
<a href="/user/zzreg/">Userpage</a> |
<a href="/msg/pms/">Notes</a> |
<a href="/controls/journal/">Journals</a> |
<a href="/plus/"><img style="position:relative;top:4px" src="/themes/beta/img/the-golden-pawb.png"> FA+</a>
<br>
</div>
<hr>
<h2><a href="/browse/">Browse</a></h2>
<h2><a href="/search/">Search</a></h2>
<h2><a href="/submit/">Upload</a></h2>
<div class="nav-ac-container">
<label for="mobile-menu-submenu-0"><h2 style="margin-top:0;padding-top:0">Support &#x25BC;</h2></label>
<input id="mobile-menu-submenu-0" name="accordion-1" type="checkbox" />
<article class="nav-ac-content nav-ac-content-dropdown">
<a href="/journals/fender">News & Updates</a><br>
<a href="/help/">Help & Support</a><br>
<a href="/advertising.html">Advertising</a><br>
<a href="/blm">Black Lives Matter</a>
<h3>SUPPORT FA</h3>
<a href="/plus/">Subscribe to FA+ </a><br>
<a href="https://shop.furaffinity.net/">FA Merch Store</a>
<h3>RULES & POLICIES</h3>
<a href="/tos">Terms of Service</a><br>
<a href="/privacy">Privacy</a><br>
<a href="/coc">Code of Conduct</a><br>
<a href="/aup">Upload Policy</a>
<h3>SOCIAL</h3>
<a href="https://discord.gg/fur-affinity">Discord</a><br>
<a href="https://www.twitter.com/furaffinity/">Twitter</a>
<h3>Support</h3>
<a href="/controls/troubletickets/">REPORT A PROBLEM</a>
</article>
</div>
<div class="mobile-sfw-toggle">
<h2>SFW Mode</h2>
<div class="sfw-toggle type-slider slider-button-wrapper">
<input type="checkbox" id="sfw-toggle-mobile" class="slider-toggle" />
<label class="slider-viewport" for="sfw-toggle-mobile">
<div class="slider">
<div class="slider-button">&nbsp;</div>
<div class="slider-content left"><span>SFW</span></div>
<div class="slider-content right"><span>NSFW</span></div>
</div>
</label>
</div>
</div>
<div class="nav-ac-container">
<label for="mobile-menu-submenu-1"><h2 style="margin-top:0;padding-top:0">Settings &#x25BC;</h2></label>
<input id="mobile-menu-submenu-1" name="accordion-1" type="checkbox" />
<article class="nav-ac-content nav-ac-content-dropdown">
<h3>ACCOUNT INFORMATION</h3>
<a href="/controls/settings/">Account Settings</a><br>
<a href="/controls/site-settings/">Global Site Settings</a><br>
<a href="/controls/user-settings/">User Settings</a>
<h3>CUSTOMIZE USER PROFILE</h3>
<a href="/controls/profile/">Profile Info</a><br>
<a href="/controls/profilebanner/">Profile Banner</a><br>
<a href="/controls/contacts/">Contacts and Social Media</a><br>
<a href="/controls/avatar/">Avatar Management</a>
<h3>MANAGE MY CONTENT</h3>
<a href="/controls/submissions/">Submissions</a><br>
<a href="/controls/folders/submissions/">Folders</a><br>
<a href="/controls/journal/">Journals</a><br>
<a href="/controls/favorites/">Favorites</a><br>
<a href="/controls/buddylist/">Watches</a><br>
<a href="/controls/shouts/">Shouts</a><br>
<a href="/controls/badges/">Badges</a>
<h3>SECURITY</h3>
<a href="/controls/sessions/logins/">Active Sessions</a><br>
<a href="/controls/sessions/logs/">Activity Log</a><br>
<a href="/controls/sessions/labels/">Browser Labels</a>
</article>
</div>
<hr>
<hr>
<h2><form class="post-btn logout-link" method="post" action="/logout/"><button type="submit">Log Out</button><input type="hidden" name="key" value="3d571edd3040f6bd34d5c9de2c26f676a79464e8"/></form>
<script type="text/javascript">
_fajs.push(['init_logout_button', '.logout-link button']);
</script>
</h2>
<h2></h2>
</div>
</article>
</div>
</div>
<div class="mobile-notification-bar">
<a class="notification-container inline" href="/msg/submissions/" title="31,533 Submission Notifications">31533S</a>
<a class="notification-container inline" href="/msg/others/#journals" title="15,201 Journal Notifications">15201J</a>
</div>
<nav id="ddmenu">
<div class="mobile-nav navhideondesktop hideonmobile hideontablet">
<div class="mobile-nav-logo"><a class="mobile-nav-logo" href="/"><img src="/themes/beta/img/banners/fa_logo.png?v2"></a></div>
<div class="mobile-nav-header-item"><a href="/browse/">Browse</a></div>
<div class="mobile-nav-header-item"><a href="/search/">Search</a></div>
</div>
<div class="menu-icon"></div>
<ul class="navhideonmobile">
<li class="lileft"><div class="lileft hideonmobile" style="vertical-align:middle;line-height:0 !important" ><a class="top-heading" href="/"><img class="nav-bar-logo" src="/themes/beta/img/banners/fa_logo.png?v2"></a></div></li>
<li class="lileft"><a class="top-heading" href="/browse/"><div class="sprite-paw menu-space-saver hideonmobile"></div>Browse</a></li>
<li class="lileft"><a class="top-heading hideondesktop" href="/search/">Search</a></li>
<li class="lileft"><a class="top-heading" href="/submit/"><div class="sprite-upload menu-space-saver hideonmobile"></div> Upload</a></li>
<li class="lileft">
<a class="top-heading" href="#"><div class="sprite-news menu-space-saver hideonmobile"></div>Support</a>
<i class="caret"></i>
<div class="dropdown dropdown-left ">
<div class="dd-inner">
<div class="column">
<h3>Community</h3>
<a href="/journals/fender">News & Updates</a>
<a href="/help/">Help & Support</a>
<a href="/advertising.html">Advertising</a>
<a href="/blm/">Black Lives Matter</a>
<h3>Rules & Policies</h3>
<a href="/tos">Terms of Service</a>
<a href="/privacy">Privacy</a>
<a href="/coc">Code of Conduct</a>
<a href="/aup">Upload Policy</a>
<h3>Social</h3>
<a href="https://discord.gg/fur-affinity">Discord</a>
<a href="https://www.twitter.com/furaffinity/">Twitter</a>
<h3>Trouble Tickets</h3>
<a href="/controls/troubletickets/">Report a Problem</a>
</div>
</div>
</div>
</li>
<li class="lileft menu-space-saver"><a class="top-heading hideontablet" href="/plus/"><img style="position:relative;top:3px" src="/themes/beta/img/the-golden-pawb.png"> FA+</a></li>
<div class="lileft hideonmobile">
<form id="searchbox" method="get" action="/search/">
<input type="search" name="q" placeholder="SEARCH">
<a href="/search">&nbsp;</a>
</form>
</div>
<li class="message-bar-desktop">
<a class="notification-container inline" href="/msg/submissions/" title="31,533 Submission Notifications">31533S</a>
<a class="notification-container inline" href="/msg/others/#journals" title="15,201 Journal Notifications">15201J</a>
</li>
<li>
<div class="floatleft hideonmobile">
<a href="/user/zzreg"><img class="loggedin_user_avatar menubar-icon-resize avatar" style="cursor:pointer" alt="zzreg" src="//a.furaffinity.net/1424255659/zzreg.gif"/></a>
</div>
</li>
<li class="submenu-trigger">
<div class="floatleft hideonmobile">
<svg class="avatar-submenu-trigger banner-svg" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 24 24"><path d="M4 6h16v2H4zm0 5h16v2H4zm0 5h16v2H4z"></path></svg>
</div>
<a id="my-username" class="top-heading hideondesktop" href="#"><span class="hideondesktop">My FA ( </span>zzreg<span class="hideondesktop"> )</span></a>
<div class="dropdown dropdown-right">
<div class="dd-inner">
<div class="column">
<h3>Account</h3>
<a href="/user/zzreg/">My Userpage</a>
<a href="/msg/pms/">Check My Notes</a>
<a href="/controls/journal/">Create a Journal</a>
<a href="/commissions/zzreg/">My Commission Info</a>
<h3>Support Fur Affinity</h3>
<a href="/plus/">Subscribe to FA+ </a>
<a href="https://shop.furaffinity.net/">Merch Store</a>
<h3>Trouble Tickets</h3>
<a href="/controls/troubletickets/">Report a Problem</a>
<div class="mobile-sfw-toggle">
<h3 class="padding-top:10px">Toggle SFW</h3>
<div class="sfw-toggle type-slider slider-button-wrapper" style="position:relative;top:5px">
<input type="checkbox" id="sfw-toggle-mobile" class="slider-toggle" />
<label class="slider-viewport" for="sfw-toggle-mobile">
<div class="slider">
<div class="slider-button">&nbsp;</div>
<div class="slider-content left"><span>SFW</span></div>
<div class="slider-content right"><span>NSFW</span></div>
</div>
</label>
</div>
</div>
<hr>
<form class="post-btn logout-link" method="post" action="/logout/"><button type="submit">Log Out</button><input type="hidden" name="key" value="3d571edd3040f6bd34d5c9de2c26f676a79464e8"/></form>
<script type="text/javascript">
_fajs.push(['init_logout_button', '.logout-link button']);
</script>
</div>
</div>
</div>
</li>
<li class="submenu-trigger">
<a class="top-heading" href="#"><svg class="banner-svg" xmlns="http://www.w3.org/2000/svg" width="36" height="36" viewBox="0 0 24 24" style="transform: ;msFilter:;"><path d="M12 16c2.206 0 4-1.794 4-4s-1.794-4-4-4-4 1.794-4 4 1.794 4 4 4zm0-6c1.084 0 2 .916 2 2s-.916 2-2 2-2-.916-2-2 .916-2 2-2z"></path><path d="m2.845 16.136 1 1.73c.531.917 1.809 1.261 2.73.73l.529-.306A8.1 8.1 0 0 0 9 19.402V20c0 1.103.897 2 2 2h2c1.103 0 2-.897 2-2v-.598a8.132 8.132 0 0 0 1.896-1.111l.529.306c.923.53 2.198.188 2.731-.731l.999-1.729a2.001 2.001 0 0 0-.731-2.732l-.505-.292a7.718 7.718 0 0 0 0-2.224l.505-.292a2.002 2.002 0 0 0 .731-2.732l-.999-1.729c-.531-.92-1.808-1.265-2.731-.732l-.529.306A8.1 8.1 0 0 0 15 4.598V4c0-1.103-.897-2-2-2h-2c-1.103 0-2 .897-2 2v.598a8.132 8.132 0 0 0-1.896 1.111l-.529-.306c-.924-.531-2.2-.187-2.731.732l-.999 1.729a2.001 2.001 0 0 0 .731 2.732l.505.292a7.683 7.683 0 0 0 0 2.223l-.505.292a2.003 2.003 0 0 0-.731 2.733zm3.326-2.758A5.703 5.703 0 0 1 6 12c0-.462.058-.926.17-1.378a.999.999 0 0 0-.47-1.108l-1.123-.65.998-1.729 1.145.662a.997.997 0 0 0 1.188-.142 6.071 6.071 0 0 1 2.384-1.399A1 1 0 0 0 11 5.3V4h2v1.3a1 1 0 0 0 .708.956 6.083 6.083 0 0 1 2.384 1.399.999.999 0 0 0 1.188.142l1.144-.661 1 1.729-1.124.649a1 1 0 0 0-.47 1.108c.112.452.17.916.17 1.378 0 .461-.058.925-.171 1.378a1 1 0 0 0 .471 1.108l1.123.649-.998 1.729-1.145-.661a.996.996 0 0 0-1.188.142 6.071 6.071 0 0 1-2.384 1.399A1 1 0 0 0 13 18.7l.002 1.3H11v-1.3a1 1 0 0 0-.708-.956 6.083 6.083 0 0 1-2.384-1.399.992.992 0 0 0-1.188-.141l-1.144.662-1-1.729 1.124-.651a1 1 0 0 0 .471-1.108z"></path></svg></a>
<div class="dropdown dropdown-right">
<div class="dd-inner">
<div class="column">
<h3>Account Information</h3>
<a href="/controls/settings/">Account Settings</a>
<a href="/controls/site-settings/">Global Site Settings</a>
<a href="/controls/user-settings/">User Settings</a>
<h3>Customize User Profile</h3>
<a href="/controls/profile/">Profile Info</a>
<a href="/controls/profilebanner/">Profile Banner</a>
<a href="/controls/contacts/">Contacts & Social Media</a>
<a href="/controls/avatar/">Avatar Management</a>
<h3>Manage My Content</h3>
<a href="/controls/submissions/">Submissions</a>
<a href="/controls/folders/submissions/">Folders</a>
<a href="/controls/journal/">Journals</a>
<a href="/controls/favorites/">Favorites</a>
<a href="/controls/buddylist/">Watches</a>
<a href="/controls/shouts/">Shouts</a>
<a href="/controls/badges/">Badges</a>
<h3>Security</h3>
<a href="/controls/sessions/logins/">Active Sessions</a>
<a href="/controls/sessions/logs/">Activity Log</a>
<a href="/controls/sessions/labels/">Browser Labels</a>
</div>
</div>
</div>
</li>
</ul>
<script type="text/javascript">
_fajs.push(['init_sfw_button', '.sfw-toggle']);
</script>
</nav>
<script type="text/javascript">
_fajs.push(function(){
// all menus that should be opened only one at a time
$$('.css-menu-toggle.only-one').invoke('observe', 'click', function(evt) {
var curr_input = $(evt.findElement('label').getAttribute('for'));
curr_input.next('.nav-ac-content').removeClassName('no-transition');
if(curr_input.checked === false) {
$$('.css-menu-toggle.only-one').each(function(elm){
var elm_input = $(elm.getAttribute('for'));
if(elm_input.checked === true) {
elm_input.next('.nav-ac-content').addClassName('no-transition');
elm_input.checked = false;
}
});
}
});
});
</script>
<div class="news-block">
</div>
<div id="main-window" class="footer-mobile-tweak g-wrapper">
<div id="header">
<!-- site banner -->
<site-banner>
<a href="/"><img src="/themes/beta/img/banners/logo/fa-banner-winter.jpg"></a>
</site-banner>
<a name="top"></a>
</div>
<div id="site-content">
<!-- /header -->
<div id="submission_page" class="page-content-type-image">
<div id="columnpage">
<div class="submission-sidebar">
<div class="sidebarAds">
<div data-id="sidebar_top" class="sidebarAds__slot format--faSmallRectangle jsAdSlot"></div>
<div data-id="sidebar_bottom" class="sidebarAds__slot format--faSmallRectangle jsAdSlot"></div>
</div>
<section class="stats-container text">
<div class="views">
<span class="font-large">201</span><br>
<span class="font-small highlight">Views</span>
</div>
<div class="comments">
<span class="font-large">0</span><br>
<span class="font-small highlight">Comments</span>
</div>
<div class="favorites">
<span class="font-large">15</span><br>
<span class="font-small highlight">Favorites</span>
</div>
<div class="rating">
<span class="font-large rating-box inline adult"> Adult</span><br>
<span class="font-small highlight">Rating</span>
</div>
</section>
<section class="buttons">
<div class="fav"><a href="/fav/51067352/?key=55993e91b5ec69977d536362a31169e1ddbd795e">+ Fav</a></div>
<div class="download"><a href="//d.furaffinity.net/art/cleverderpy/1676764142/1676764142.cleverderpy_tarryn_and_rosie_shaymin_tar_cv_00001.png">Download</a></div>
<div class="note"><a href="/newpm/cleverderpy/">Note</a></div>
</section>
<section class="info text">
<div><strong class="highlight">Category</strong> <div><span class="category-name">Artwork (Digital)</span> / <span class="type-name">Vore</span></div></div> <div><strong class="highlight">Species</strong> <span>Unspecified / Any</span></div> <div><strong class="highlight">Gender</strong> <span>Multiple characters</span></div> <div><strong class="highlight">Size</strong> <span>1920 x 1080</span></div> </section>
<section class="tags-row">
<span class="tags"><a href="/search/@keywords pokemon">pokemon</a></span>
<span class="tags"><a href="/search/@keywords rosie">rosie</a></span>
<span class="tags"><a href="/search/@keywords shaymin">shaymin</a></span>
<span class="tags"><a href="/search/@keywords hedgegog">hedgegog</a></span>
<span class="tags"><a href="/search/@keywords naked">naked</a></span>
<span class="tags"><a href="/search/@keywords nude">nude</a></span>
<span class="tags"><a href="/search/@keywords female">female</a></span>
<span class="tags"><a href="/search/@keywords anthro">anthro</a></span>
<span class="tags"><a href="/search/@keywords cock">cock</a></span>
<span class="tags"><a href="/search/@keywords vore">vore</a></span>
<span class="tags"><a href="/search/@keywords tar">tar</a></span>
<span class="tags"><a href="/search/@keywords quicksand">quicksand</a></span>
<span class="tags"><a href="/search/@keywords sinking">sinking</a></span>
<span class="tags"><a href="/search/@keywords stuck">stuck</a></span>
<span class="tags"><a href="/search/@keywords tarryn">tarryn</a></span>
<span class="tags"><a href="/search/@keywords sirnopesalot112">sirnopesalot112</a></span>
<span class="tags"><a href="/search/@keywords sinnoh">sinnoh</a></span>
<span class="tags"><a href="/search/@keywords diamond">diamond</a></span>
<span class="tags"><a href="/search/@keywords pearl">pearl</a></span>
<span class="tags"><a href="/search/@keywords platinum">platinum</a></span>
<span class="tags"><a href="/search/@keywords mythical">mythical</a></span>
<span class="tags"><a href="/search/@keywords grass">grass</a></span>
<span class="tags"><a href="/search/@keywords cleverderpy">cleverderpy</a></span>
<span class="tags"><a href="/search/@keywords cv">cv</a></span>
<span class="tags"><a href="/search/@keywords pier">pier</a></span>
<span class="tags"><a href="/search/@keywords dock">dock</a></span>
<span class="tags"><a href="/search/@keywords pumping">pumping</a></span>
<span class="tags"><a href="/search/@keywords messy">messy</a></span>
<span class="tags"><a href="/search/@keywords wam">wam</a></span>
</section>
<div class="rectangleAd">
<div data-id="sidebar" class="rectangleAd__slot format--mediumRectangle jsAdSlot"></div>
</div>
<section class="shinies-promo text">
<div class="shinies-promo-star"></div>
<div class="shinies-promo-text"><a href="/user/cleverderpy/#tip">Like CleverDerpy's stuff? Support them by sending some Shinies their way!</a></div>
</section>
<section class="minigallery-more">
<h3>See more from <a href="/gallery/cleverderpy/">CleverDerpy</a></h3>
<div class="preview-gallery hideonmobile">
<div class="preview-gallery-container">
<a href="/view/51007825/"><img class="preview-gallery-image" title="Valantine's Day Card 2023!" src="//t.furaffinity.net/51007825@200-1676384797.jpg"/></a>
</div>
<div class="preview-gallery-container">
<a href="/view/50942074/"><img class="preview-gallery-image" title="The Great and Powerful!" src="//t.furaffinity.net/50942074@200-1675948043.jpg"/></a>
</div>
<div class="preview-gallery-container">
<a href="/view/50941989/"><img class="preview-gallery-image" title="Belly Dancer Deerlia Deerling" src="//t.furaffinity.net/50941989@200-1675947373.jpg"/></a>
</div>
<div class="preview-gallery-container">
<a href="/view/50924842/"><img class="preview-gallery-image" title="Deerlia... Lopunny? -Year of the Rabbit-" src="//t.furaffinity.net/50924842@200-1675820723.jpg"/></a>
</div>
<div class="preview-gallery-container">
<a href="/view/50924800/"><img class="preview-gallery-image" title="Rosie... Cinderace? -Year of the Rabbit-" src="//t.furaffinity.net/50924800@200-1675820464.jpg"/></a>
</div>
<div class="preview-gallery-container">
<a href="/view/50502079/"><img class="preview-gallery-image" title="Approaching the Martian Roche Limit!" src="//t.furaffinity.net/50502079@200-1672997142.jpg"/></a>
</div>
</div>
</section>
<section class="folder-list-container text">
<h3>Listed in Folders</h3>
<div>
<a href="/gallery/cleverderpy/folder/38111/Cock-Vore/" title="62 submissions" class="dotted">
<strong>Vore</strong> -
<span>Cock Vore</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/38133/Tar/" title="119 submissions" class="dotted">
<strong>Quicksand</strong> -
<span>Tar</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/38204/Stuck-or-tied-up/" title="690 submissions" class="dotted">
<strong>Bondage</strong> -
<span>Stuck or tied up</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/41707/Special-Things/" title="765 submissions" class="dotted">
<span>Special Things</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/84356/Art-Trades/" title="516 submissions" class="dotted">
<span>Art Trades</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/156873/Request-Remix/" title="454 submissions" class="dotted">
<span>Request Remix</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/207777/Pokemon-Neo/" title="359 submissions" class="dotted">
<span>Pokemon Neo</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/569384/True-Chars/" title="87 submissions" class="dotted">
<span>True Chars</span>
</a>
</div>
</section>
</div>
<div class="submission-content">
<div class="leaderboardAd">
<div data-id="header_middle" class="leaderboardAd__slot format--leaderboard jsAdSlot"></div>
</div>
<div class="aligncenter submission-area">
<img id="submissionImg" title="Click to change the View" alt="The Second Kind of Tarpit" data-fullview-src="//d.furaffinity.net/art/cleverderpy/1676764142/1676764142.cleverderpy_tarryn_and_rosie_shaymin_tar_cv_00001.png" data-preview-src="//t.furaffinity.net/51067352@600-1676764142.jpg" src="//d.furaffinity.net/art/cleverderpy/1676764142/1676764142.cleverderpy_tarryn_and_rosie_shaymin_tar_cv_00001.png" style="cursor: pointer;" />
</div>
<div class="aligncenter auto_link hideonfull1 favorite-nav">
<a class="button standard mobile-fix" href="/fav/51067352/?key=55993e91b5ec69977d536362a31169e1ddbd795e">+Fav</a>
<a class="button standard mobile-fix" href="/gallery/cleverderpy/" title="1213 submissions">Main Gallery</a>
<a class="button standard mobile-fix" href="//d.furaffinity.net/art/cleverderpy/1676764142/1676764142.cleverderpy_tarryn_and_rosie_shaymin_tar_cv_00001.png">Download</a>
<a class="button standard mobile-fix" href="/newpm/cleverderpy/">Note</a>
<a href="/view/51007825/" class="button standard mobile-fix">Next</a>
</div>
<section>
<div class="section-header">
<div class="submission-id-container">
<div class="submission-id-avatar">
<a href="/user/cleverderpy/"><img class="submission-user-icon floatleft avatar" src="//a.furaffinity.net/1673878431/cleverderpy.gif"></a>
</div>
<div class="submission-id-sub-container">
<div class="submission-title">
<h2><p>The Second Kind of Tarpit</p></h2>
</div>
By <a href="/user/cleverderpy/"><strong>CleverDerpy</strong></a>,
<span class="hideontablet hideondesktop"><br> </span>
<span class="hideonmobile">posted </span>
<strong><span title="Feb 18, 2023 06:49 PM" class="popup_date">a day ago</span></strong>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;Digital Artist&nbsp;|&nbsp;<a href="/user/cleverderpy/#tip">Support me with Shinies!</a> </div>
</div>
</div>
<div class="section-body">
<div class="submission-description user-submitted-links">
Rosie Shaymin is going to be inside the massive balls of Tarryn, <a href="/user/sirnopesalot112" class="iconusername"><img src="//a.furaffinity.net/20230219/sirnopesalot112.gif" align="middle" title="sirnopesalot112" alt="sirnopesalot112" /></a> 's lovely Tarboi God!<br />
Already enjoying the sensation, she slowly pumps her legs into his gooey Cock~<br />
---<br />
Rosie Shaymin belongs to me, <a href="/user/cleverderpy" class="iconusername"><img src="//a.furaffinity.net/20230219/cleverderpy.gif" align="middle" title="cleverderpy" alt="cleverderpy" /></a><br />
Tarryn belongs to <a href="/user/sirnopesalot112" class="iconusername"><img src="//a.furaffinity.net/20230219/sirnopesalot112.gif" align="middle" title="sirnopesalot112" alt="sirnopesalot112" /></a><br />
Shaymin (Land Forme) belongs to Nintendo/Game Freak/TPCi<br />
---<br />
Created by CleverDerpy Arts, 2012-2023<br />
(Some Rights Reserved)
<div class="submission-footer">
<hr />
For tips, send me Shinies here: <a href="https://www.furaffinity.net/user/cleverderpy/#tip" title="https://www&#46;furaffinity&#46;net/user/cleverderpy/#tip" class="auto_link">https://www.furaffinity.net/user/cleverderpy/#tip</a> <br />
Or go here for my PayPal directly, for tips or commissions, send a note first! <a href="https://paypal.me/cleverderpy" title="https://paypal&#46;me/cleverderpy" class="auto_link">https://paypal.me/cleverderpy</a> (Do not leave Notes on Paypal when paying, thank you!)<br />
---<br />
Visit for your Requests, Trades, Gifts, and special orders here: <a href="https://forms.gle/bmrTzqFsmZaAK4Z46" title="https://forms&#46;gle/bmrTzqFsmZaAK4Z46" class="auto_link">https://forms.gle/bmrTzqFsmZaAK4Z46</a><br />
---<br />
For Fastest Service reach out on my discord: Deerlia Deerling#8967 (Please mention you found me on FA or that you're from FA, thanks!) </div>
</div>
</div>
<!-- mobile view -->
<div class="section-footer section-footer-padding hideonfull alignright">
<div class="submission-stats-container">
<div class="views">
<span class="font-large">201</span><br>
<span class="font-small highlight">Views</span>
</div>
<div class="favorites">
<span class="font-large">15</span><br>
<span class="font-small highlight">Favorites</span>
</div>
<div class="comments">
<span class="font-large">0</span><br>
<span class="font-small highlight">Comments</span>
</div>
<div class="rating">
<span class="font-large rating-box inline adult"> Adult</span><br>
<span class="font-small highlight">Rating</span>
</div>
</div>
</div>
</section>
<!-- mobile view -->
<div class="hideonfull">
<section class="stats-mobile">
<div class="section-body info">
<div><strong class="highlight">Category</strong> <span class="category-name">Artwork (Digital)</span> / <span class="type-name">Vore</span></div> <div><strong class="highlight">Species</strong> <span>Unspecified / Any</span></div> <div><strong class="highlight">Gender</strong> <span>Multiple characters</span></div> <div><strong class="highlight">Size</strong> <span>1920 x 1080px</span></div> </div>
</section>
<section class="tags-mobile">
<div class="section-body">
<span class="tags"><a href="/search/@keywords pokemon">pokemon</a></span>
<span class="tags"><a href="/search/@keywords rosie">rosie</a></span>
<span class="tags"><a href="/search/@keywords shaymin">shaymin</a></span>
<span class="tags"><a href="/search/@keywords hedgegog">hedgegog</a></span>
<span class="tags"><a href="/search/@keywords naked">naked</a></span>
<span class="tags"><a href="/search/@keywords nude">nude</a></span>
<span class="tags"><a href="/search/@keywords female">female</a></span>
<span class="tags"><a href="/search/@keywords anthro">anthro</a></span>
<span class="tags"><a href="/search/@keywords cock">cock</a></span>
<span class="tags"><a href="/search/@keywords vore">vore</a></span>
<span class="tags"><a href="/search/@keywords tar">tar</a></span>
<span class="tags"><a href="/search/@keywords quicksand">quicksand</a></span>
<span class="tags"><a href="/search/@keywords sinking">sinking</a></span>
<span class="tags"><a href="/search/@keywords stuck">stuck</a></span>
<span class="tags"><a href="/search/@keywords tarryn">tarryn</a></span>
<span class="tags"><a href="/search/@keywords sirnopesalot112">sirnopesalot112</a></span>
<span class="tags"><a href="/search/@keywords sinnoh">sinnoh</a></span>
<span class="tags"><a href="/search/@keywords diamond">diamond</a></span>
<span class="tags"><a href="/search/@keywords pearl">pearl</a></span>
<span class="tags"><a href="/search/@keywords platinum">platinum</a></span>
<span class="tags"><a href="/search/@keywords mythical">mythical</a></span>
<span class="tags"><a href="/search/@keywords grass">grass</a></span>
<span class="tags"><a href="/search/@keywords cleverderpy">cleverderpy</a></span>
<span class="tags"><a href="/search/@keywords cv">cv</a></span>
<span class="tags"><a href="/search/@keywords pier">pier</a></span>
<span class="tags"><a href="/search/@keywords dock">dock</a></span>
<span class="tags"><a href="/search/@keywords pumping">pumping</a></span>
<span class="tags"><a href="/search/@keywords messy">messy</a></span>
<span class="tags"><a href="/search/@keywords wam">wam</a></span>
</div>
</section>
<section class="folders-mobile">
<div class="section-body">
<h3>Listed in Folders</h3>
<div>
<a href="/gallery/cleverderpy/folder/38111/Cock-Vore/" title="62 submissions" class="dotted">
<strong>Vore</strong> -
<span>Cock Vore</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/38133/Tar/" title="119 submissions" class="dotted">
<strong>Quicksand</strong> -
<span>Tar</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/38204/Stuck-or-tied-up/" title="690 submissions" class="dotted">
<strong>Bondage</strong> -
<span>Stuck or tied up</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/41707/Special-Things/" title="765 submissions" class="dotted">
<span>Special Things</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/84356/Art-Trades/" title="516 submissions" class="dotted">
<span>Art Trades</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/156873/Request-Remix/" title="454 submissions" class="dotted">
<span>Request Remix</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/207777/Pokemon-Neo/" title="359 submissions" class="dotted">
<span>Pokemon Neo</span>
</a>
</div>
<div>
<a href="/gallery/cleverderpy/folder/569384/True-Chars/" title="87 submissions" class="dotted">
<span>True Chars</span>
</a>
</div>
</div>
</section>
</div>
<div class="comments-list">
<div id="responsebox" class="aligncenter">
<form name="myform" method="post" action="/view/51067352/" id="add_comment_form">
<div class="section-body no-padding">
<input type="hidden" name="f" value="0"/>
<input type="hidden" name="action" value="reply" id="form-action">
<input type="hidden" name="replyto" id="form-replyto" value=""/>
<textarea id="JSMessage" name="reply" class="textarea textarearesize" placeholder="Type your comment here."></textarea>
</div>
<div class="section-footer alignright">
<span class="floatleft" style="padding: 7px 0 0 0"><i class="bbcodeformat b hand" title="Bold (CTRL+B)" onclick="performInsert(this, '[b]', '[/b]');"></i>
<i class="bbcodeformat i hand" title="Italic (CTRL+I)" onclick="performInsert(this, '[i]', '[/i]');"></i>
<i class="bbcodeformat u hand" title="Underlined (CTRL+U)" onclick="performInsert(this, '[u]', '[/u]');"></i>
&nbsp;&nbsp;&nbsp;
<i class="bbcodeformat align_left hand" title="Align Left" onclick="performInsert(this, '[left]', '[/left]');"></i>
<i class="bbcodeformat align_center hand" title="Align Center" onclick="performInsert(this, '[center]', '[/center]');"></i>
<i class="bbcodeformat align_right hand" title="Align Right" onclick="performInsert(this, '[right]', '[/right]');"></i>
</span>
<button class="go post-comment" type="submit" name="submit" value="Post Comment">Post Comment</button>
</div>
</form>
</div>
<script type="text/javascript">
_fajs.push(['init_bbcode_hotkeys', 'JSMessage']);
</script>
<div id="comments-submission">
</div>
<script type="text/javascript">
_fajs.push(['init_reply_links', 'comments-submission']);
</script>
</div>
</div>
</div>
</div>
<script type="text/javascript">
var ctrl_key_hold = false;
var shift_key_hold = false;
var comment_edit_window_sec = 300;
_fajs.push(function(){
document.observe('keydown', function(evt){
if(evt.keyCode == 16)
shift_key_hold = true;
if(evt.keyCode == 17)
ctrl_key_hold = true;
});
document.observe('keyup', function(evt){
var selected_tags = $$('#keywords .keyword-active');
var search_keywords = '';
var delimiter = shift_key_hold ? ' | ' : ' ';
for(var i=0, cnt=selected_tags.length; i<cnt; i++)
search_keywords += selected_tags[i].innerHTML.replace(/[^-_\w\d ]+/, '') + delimiter;
if(search_keywords)
{
search_keywords = search_keywords.substr(0, search_keywords.length-(shift_key_hold?3:1));
var url = '/search/@keywords '+escape(search_keywords);
window.location.href = url;
}
shift_key_hold = false;
ctrl_key_hold = false;
});
document.observe('click', function(evt){
if(!evt.findElement('#keywords'))
return true;
var elm = evt.element();
if(elm.tagName.toLowerCase() != 'a')
return true;
if(shift_key_hold || ctrl_key_hold)
{
evt.stop();
elm.toggleClassName('keyword-active');
}
});
// hide comment edit links upon comment edit window expiring
edit_links_hide_handler();
});
_fajs.push(function(){
//
// initialize lightbox
//
var img = $('submissionImg');
if(img) {
img.observe('click', function(evt) {
evt.stop();
var img = $(evt.element()).clone(true);
img.src = img.readAttribute('data-fullview-src');
lightbox_create('submission', img);
});
}
});
_fajs.push(function(){
$$('span.popup_date').each(function(elm){
elm.observe('click',function(evt){
var elm = evt.element();
var tmp=elm.title;
elm.title=elm.innerHTML;
elm.innerHTML=tmp;
})
});
});
</script>
</div>
<!-- /<div id="site-content"> -->
<div id="footer">
<div class="auto_link footer-links">
<span class="hideonmobile">
<a href="/advertising">Advertise</a> |
<a href="/plus"><img style="position:relative;top:4px" src="/themes/beta/img/the-golden-pawb.png"> Get FA+</a> |
<a href="https://shop.furaffinity.net/">Merch Store</a> |
<a href="/tos">Terms of Service</a> |
<a href="/privacy">Privacy</a> |
<a href="/coc">Code of Conduct</a> |
<a href="/aup">Upload Policy</a>
</span>
</div>
<div class="footerAds">
<div class="footerAds__column">
<div class="footerAds__slot format--faMediumRectangle jsAdSlot" data-id="footer_left"></div>
</div>
<div class="footerAds__column">
<div class="footerAds__slot footerAds__slot--faLogo">
<img src="/themes/beta/img/banners/fa_logo.png?v2">
</div>
</div>
<div class="footerAds__column">
<div class="footerAds__slot format--faSmallRectangle jsAdSlot" data-id="footer_right_top"></div>
<div class="footerAds__slot format--faSmallRectangle jsAdSlot" data-id="footer_right_bottom"></div>
</div>
</div>
<div class="online-stats">
50213 <strong><span title="Measured in the last 900 seconds">Users online</span></strong> &mdash;
2440 <strong>guests</strong>,
17749 <strong>registered</strong>
and 30024 <strong>other</strong>
<!-- Online Counter Last Update: Sun, 19 Feb 2023 13:35:00 -0800 -->
</div>
<small>Limit bot activity to periods with less than 10k registered users online.</small>
<br><br>
<strong>&copy; 2005-2023 Frost Dragon Art LLC</strong>
<div class="footnote">
Server Time: Feb 19, 2023 01:35 PM </div>
</div>
<div id="cookie-notification" class="default-hidden">
<div class="text-container">This website uses cookies to enhance your browsing experience. <a href="/privacy" target="_blank">Learn More</a></div>
<div class="button-container"><button class="accept">I Consent</button></div>
</div>
<script type="text/javascript">
_fajs.push(function(){
$$('#cookie-notification button').invoke('observe', 'click', function() {
setCookie('cc', 1, expiryyear, '/');
$('cookie-notification').addClassName('default-hidden');
});
$('cookie-notification').removeClassName('default-hidden');
});
</script>
</div>
<!-- <div id="main-window"> -->
<!--
Server Local Time: Feb 19, 2023 01:35 PM <br />
Page generated in 0.019 seconds [ 21.2% PHP, 78.8% SQL ] (24 queries) -->
<script type="text/javascript">
_fajs.push(function() {
var exists = getCookie('sz');
var saved = save_viewport_size();
if((!exists && saved) || (exists && saved && exists != saved)) {
//window.location.reload();
}
});
</script>
<script type="text/javascript" src="/themes/beta/js/prototype.1.7.3.min.js"></script>
<script type="text/javascript" src="/themes/beta/js/script.js?u=2023011700"></script>
<script type="text/javascript">
var server_timestamp = 1676842522;
var client_timestamp = ((new Date()).getTime())/1000;
var server_timestamp_delta = server_timestamp - client_timestamp;
var sfw_cookie_name = 'sfw';
var news_cookie_name = 'n';
var adData = {"sizeConfig":[{"labels":["desktopWide"],"mediaQuery":"(min-width: 1065px)","sizesSupported":[[728,90],[300,250],[300,168],[300,600],[160,600]]},{"labels":["desktopNarrow"],"mediaQuery":"(min-width: 720px) and (max-width: 1064px)","sizesSupported":[[728,90],[300,250],[300,168]]},{"labels":["mobile"],"mediaQuery":"(min-width: 0px) and (max-width: 719px)","sizesSupported":[[320,50],[300,50],[320,100]]}],"slotConfig":{"header_middle":{"containerSize":{"desktopWide":[728,100],"desktopNarrow":[728,100],"mobile":[320,100]},"providerPriority":["inhouse"]},"above_content":{"containerSize":{"desktopWide":[728,100],"desktopNarrow":[728,100],"mobile":[320,100]},"providerPriority":["inhouse"]},"sidebar":{"containerSize":{"desktopWide":[300,250]},"providerPriority":["inhouse"]},"sidebar_tall":{"containerSize":{"desktopWide":[300,600]},"providerPriority":["inhouse"]},"footer_left":{"containerSize":{"desktopWide":[300,200],"desktopNarrow":[300,200],"mobile":[300,200]},"providerPriority":["inhouse"]},"footer_right_top":{"containerSize":{"desktopWide":[300,90],"desktopNarrow":[300,90],"mobile":[300,90]},"providerPriority":["inhouse"]},"footer_right_bottom":{"containerSize":{"desktopWide":[300,90],"desktopNarrow":[300,90],"mobile":[300,90]},"providerPriority":["inhouse"]},"header_right_left":{"containerSize":{"desktopWide":[300,90]},"providerPriority":["inhouse"]},"header_right_right":{"containerSize":{"desktopWide":[300,90]},"providerPriority":["inhouse"]},"sidebar_top":{"containerSize":{"desktopWide":[300,90]},"providerPriority":["inhouse"]},"sidebar_bottom":{"containerSize":{"desktopWide":[300,90]},"providerPriority":["inhouse"]}},"providerConfig":{"inhouse":{"domain":"https:\/\/rv.furaffinity.net","dataPath":"\/live\/www\/delivery\/spc.php","dataVariableName":"OA_output"}},"adConfig":{"inhouse":{"header_middle":{"default":{"tagId":11,"tagSize":[728,90]},"sizeOverride":{"mobile":{"tagId":19,"tagSize":[300,90]}}},"above_content":{"default":{"tagId":15,"tagSize":[728,90]},"sizeOverride":{"mobile":{"tagId":17,"tagSize":[300,90]}}},"sidebar":{"default":{"tagId":13,"tagSize":[300,250]}},"sidebar_tall":{"default":{"tagId":13,"tagSize":[300,250]}},"footer_left":{"default":{"tagId":10,"tagSize":[300,200]}},"footer_right_top":{"default":{"tagId":5,"tagSize":[300,90]}},"footer_right_bottom":{"default":{"tagId":6,"tagSize":[300,90]}},"header_right_left":{"default":{"tagId":2,"tagSize":[300,90]}},"header_right_right":{"default":{"tagId":4,"tagSize":[300,90]}},"sidebar_top":{"default":{"tagId":2,"tagSize":[300,90]}},"sidebar_bottom":{"default":{"tagId":4,"tagSize":[300,90]}}}}};
window.fad = new adManager(adData.sizeConfig, adData.slotConfig, adData.providerConfig, adData.adConfig, 1);
</script>
<script type="text/javascript">
_fajs.push(function() {
var ddmenuOptions = {
menuId: "ddmenu",
linkIdToMenuHtml: null,
open: "onmouseover", // or "onclick"
delay: 1,
speed: 1,
keysNav: true,
license: "2c1f72"
};
var ddmenu = new Ddmenu(ddmenuOptions);
});
</script>
</body>
<!---
|\ /|
/_^ ^_\
\v/
The fox goes "moo!"
--->
</html>

View File

@@ -29,6 +29,7 @@ class Domain::Fa::Parser::ReduxPageTest < ActiveSupport::TestCase
def test_user_page_is_correct
parser = get_parser "user_page_miles_df.html"
assert parser.logged_in?
assert_page_type parser, :probably_user_page?
assert parser.probably_user_page?
up = parser.user_page
@@ -47,7 +48,7 @@ class Domain::Fa::Parser::ReduxPageTest < ActiveSupport::TestCase
def test_gallery_is_correct
parser = get_parser "gallery_page_miles_df.html"
assert parser.logged_in?
assert parser.probably_listings_page?
assert_page_type parser, :probably_listings_page?
listings = parser.submissions_parsed
assert_equal 48, listings.length
@@ -69,7 +70,7 @@ class Domain::Fa::Parser::ReduxPageTest < ActiveSupport::TestCase
def test_gallery_is_correct_with_folders
parser = get_parser "gallery_page_with_folders_feretta.html"
assert parser.probably_listings_page?
assert_page_type parser, :probably_listings_page?
listings = parser.submissions_parsed
assert_equal 48, listings.length
@@ -102,8 +103,7 @@ class Domain::Fa::Parser::ReduxPageTest < ActiveSupport::TestCase
# https://www.furaffinity.net/browse/
parser = get_parser "browse_page.html"
assert parser.probably_listings_page?
assert !parser.probably_submission?
assert_page_type parser, :probably_listings_page?
listings = parser.submissions_parsed
# FA appears to respond with only 47?
@@ -118,15 +118,38 @@ class Domain::Fa::Parser::ReduxPageTest < ActiveSupport::TestCase
assert_equal "//t.furaffinity.net/51067352@400-1676764142.jpg", first.thumb_path
end
def test_adult_submission
parser = get_parser "submission_51067352_adult.html"
assert_page_type parser, :probably_submission?
sub = parser.submission
assert_equal 51067352, sub.id
assert_equal "CleverDerpy", sub.artist
assert_equal "/user/cleverderpy/", sub.artist_user_page_path
assert_equal "The Second Kind of Tarpit", sub.title
assert_equal :adult, sub.rating
assert_equal "//d.furaffinity.net/art/cleverderpy/1676764142/1676764142.cleverderpy_tarryn_and_rosie_shaymin_tar_cv_00001.png", sub.full_res_img
assert_equal DateTime.new(2023, 2, 18, 18, 49), sub.posted_date
assert_equal "Artwork (Digital)", sub.category
assert_equal "Vore", sub.theme
assert_equal "Unspecified / Any", sub.species
assert_equal "Multiple characters", sub.gender
assert_equal 201, sub.num_views
assert_equal 0, sub.num_comments
assert_equal 15, sub.num_favorites
assert_equal "1920x1080", sub.resolution_str
assert sub.description_html =~ /belongs to Nintendo/
end
def test_submission_is_correct
parser = get_parser "submission_51067333_blauhaher.html"
assert parser.probably_submission?
assert_page_type parser, :probably_submission?
sub = parser.submission
assert_equal 51067333, sub.id
assert_equal "BlauHaher", sub.artist
assert_equal "/user/blauhaher/", sub.artist_user_page_path
assert_equal '"CUTIE!"', sub.title
assert_equal :general, sub.rating
assert_equal "//d.furaffinity.net/art/blauhaher/1676764049/1676764049.blauhaher_хорнь.png", sub.small_img
assert_equal "//d.furaffinity.net/art/blauhaher/1676764049/1676764049.blauhaher_хорнь.png", sub.full_res_img
assert_equal DateTime.new(2023, 2, 18, 18, 47), sub.posted_date
@@ -144,13 +167,14 @@ class Domain::Fa::Parser::ReduxPageTest < ActiveSupport::TestCase
def test_submission_with_tags
parser = get_parser "submission_19190013_korichi.html"
assert parser.probably_submission?
assert_page_type parser, :probably_submission?
sub = parser.submission
assert_equal 19190013, sub.id
assert_equal "Korichi", sub.artist
assert_equal "General Furry Art", sub.theme
assert_equal "Artwork (Digital)", sub.category
assert_equal :general, sub.rating
assert_equal "1280x914", sub.resolution_str
assert_equal 6272, sub.num_views
assert_equal "Male", sub.gender
@@ -161,7 +185,7 @@ class Domain::Fa::Parser::ReduxPageTest < ActiveSupport::TestCase
def test_text_only_submission
parser = get_parser("submission_10327196_icyfoxy_text_only.html")
assert parser.probably_submission?
assert_page_type parser, :probably_submission?
sub = parser.submission
assert_equal 10327196, sub.id
@@ -169,6 +193,7 @@ class Domain::Fa::Parser::ReduxPageTest < ActiveSupport::TestCase
assert_equal "/user/icyfoxy/", sub.artist_user_page_path
assert_equal "Ancient Awakening- Wereyena herm TF (By Wyraachur)", sub.title
assert_equal "//d.furaffinity.net/download/art/icyfoxy/stories/1488278723/1365480658.icyfoxy_sonya_the_wereyena.txt", sub.full_res_img
assert_equal :adult, sub.rating
assert_equal 819, sub.num_views
assert_equal 0, sub.num_comments
assert_equal 12, sub.num_favorites
@@ -176,11 +201,38 @@ class Domain::Fa::Parser::ReduxPageTest < ActiveSupport::TestCase
assert_equal "Story", sub.category
assert_equal "General Furry Art", sub.theme
assert_equal "50x50", sub.resolution_str
assert_equal %w[Transformation TF Change Male Herm TFTG Transgender Growth Fang Breasts Ass Cock Balls Icyfoxy Wyraachur wereyena Sonya], sub.keywords_array
assert_equal %w[Transformation TF Change Male Herm TFTG Transgender
Growth Fang Breasts Ass Cock Balls Icyfoxy Wyraachur
wereyena Sonya], sub.keywords_array
assert_equal "Other / Not Specified", sub.gender
assert_equal DateTime.new(2013, 4, 9, 0, 10), sub.posted_date
end
def test_submission_id_is_correct_20340491
parser = get_parser("submission_20340491.html")
assert_page_type parser, :probably_submission?
sub = parser.submission
assert_equal 20340491, sub.id
assert_equal "Skye", sub.title
assert_equal :general, sub.rating
end
def test_flash_submission
parser = get_parser("submission_21956745_flash.html")
assert_page_type parser, :probably_submission?
sub = parser.submission
assert_equal 21956745, sub.id
assert_equal "Drake Test: Take One", sub.title
assert_equal :mature, sub.rating
assert_equal "Tasuric", sub.artist
assert_equal "Flash", sub.category
assert_equal "Animal related (non-anthro)", sub.theme
assert (/A closeup of the drake g/) =~ sub.description_html
assert_equal "//d.furaffinity.net/download/art/tasuric/1481384060/1481384060.tasuric_tasflash_camnom.swf", sub.full_res_img
end
def get_parser(file, require_logged_in: true)
path = File.join("domain/fa/parser/redux", file)
contents = read_fixture_file(path) || raise("Couldn't open #{path}")
@@ -188,4 +240,18 @@ class Domain::Fa::Parser::ReduxPageTest < ActiveSupport::TestCase
assert_equal Domain::Fa::Parser::Page::VERSION_2, page.page_version, "page version mismatch for file #{file}"
page
end
def assert_page_type(parser, expected_type)
types = [
:probably_listings_page?,
:probably_user_page?,
:probably_submission?,
]
outcomes = types.map do |type|
[type, parser.send(type)]
end.to_h
assert_equal 1, outcomes.values.filter { |a| a }.to_a.length, "parser detected multiple page types: #{outcomes}"
assert outcomes[expected_type], "parser has wrong guessed page type, expected #{expected_type}, got #{outcomes}"
end
end

View File

@@ -11,7 +11,7 @@ class ActiveSupport::TestCase
# Add more helper methods to be used by all tests here...
parallelize_teardown do
Rails.log.error "Deleting all records: #{ReduxApplicationRecord.subclasses.map(&:name)}"
Rails.logger.error "Deleting all records: #{ReduxApplicationRecord.subclasses.map(&:name)}"
ReduxApplicationRecord.subclasses.each(&:delete_all)
end