:Search:

Waylon Thibodeaux Who s Yo Cher Bébé 2008 FLAC 16 44 1

Torrent:
Info Hash: 542B4D2FEE75293567F16CEB55E8C3C4423AA467
Similar Posts:
Uploader: FrankVjecy
Source: 1 Logo 1337x
Downloads: 3
Type: Lossless
Images:
Waylon Thibodeaux Who s Yo Cher Bébé 2008 FLAC 16 44 1
Language: English
Description:
Client:  fre:ac - free audio converter
Version: v1.1.7 (x86-64)
System:  "openSUSE Tumbleweed" (Linux 6.9.1-1-default)
CPU:     AMD A10-5700 APU with Radeon(tm) HD Graphics
RAM:     17.5 GB
Date:    2024-06-01
Time:    16:36:46
hh:mm:ss.fff
------------
00:00:00.412 Starting conversion process...
00:00:00.412     Selected encoder:     FLAC Audio Encoder v1.4.2
00:00:00.413     Parallel processing:  Enabled (up to 4 threads)
00:00:00.413         SuperFast mode:   Disabled
00:00:00.413
00:00:00.413     Output settings:      Multiple files
00:00:00.413         Filename pattern: /[] /. <br>00:00:00.414<br>00:00:00.414     Output verification:  Enabled<br>00:00:00.414<br>00:00:00.526     Using drive:          device://cdda:0/<br>00:00:00.526         Drive model:      hp DVD A  DH16ACSHR JHG7<br>00:00:00.526         Device path:      /dev/sr0<br>00:00:00.526         Read offset:      670 samples<br>00:00:00.526<br>00:00:00.527     Disc TOC:<br>00:00:00.527<br>00:00:00.527         Track |   Start  |  Length  | Start sector | End sector<br>00:00:00.527         -------------------------------------------------------<br>00:00:00.527             1 | 00:00.00 | 03:04.17 |            0 |      13816<br>00:00:00.527             2 | 03:04.17 | 03:32.01 |        13817 |      29717<br>00:00:00.527             3 | 06:36.18 | 03:28.74 |        29718 |      45391<br>00:00:00.528             4 | 10:05.17 | 03:33.70 |        45392 |      61436<br>00:00:00.528             5 | 13:39.12 | 03:30.07 |        61437 |      77193<br>00:00:00.528             6 | 17:09.19 | 03:07.02 |        77194 |      91220<br>00:00:00.528             7 | 20:16.21 | 03:43.34 |        91221 |     107979<br>00:00:00.528             8 | 23:59.55 | 03:24.57 |       107980 |     123336<br>00:00:00.528             9 | 27:24.37 | 03:37.01 |       123337 |     139612<br>00:00:00.528            10 | 31:01.38 | 03:11.68 |       139613 |     154005<br>00:00:00.529            11 | 34:13.31 | 03:16.34 |       154006 |     168739<br>00:00:00.529            12 | 37:29.65 | 03:59.29 |       168740 |     186693<br>00:00:00.529            13 | 41:29.19 | 05:55.30 |       186694 |     213348<br>00:00:00.529            14 | 47:24.49 | 03:33.11 |       213349 |     229334<br>00:00:00.529<br>00:00:00.529     Disc info:<br>00:00:00.530         CDDB disc ID:  b50bf10e<br>00:00:00.530         CDDB category: folk<br>00:00:00.530<br>00:00:00.530         Artist:        Waylon Thibodeaux<br>00:00:00.530         Album:         Who's Yo' Cher Bébé<br>00:00:00.530         Genre:         Cajun<br>00:00:00.530         Published:     2008<br>00:00:00.530<br>00:00:00.530         Track | Offset | Track title<br>00:00:00.531         -------------------------------------------------------<br>00:00:00.531             1 |    150 | Sweet Colinda<br>00:00:00.531             2 |  13967 | I Love My Baby And My Baby Loves Me<br>00:00:00.531             3 |  29868 | Chenier Tigre<br>00:00:00.531             4 |  45542 | Big Blue Tears<br>00:00:00.531             5 |  61587 | Sometimes A Fiddle<br>00:00:00.531             6 |  77344 | Giving Up The Ghost<br>00:00:00.531             7 |  91371 | Riding On These Roses<br>00:00:00.531             8 | 108130 | Hey Maman<br>00:00:00.532             9 | 123487 | I Just Wanna Be Bayou<br>00:00:00.532            10 | 139763 | My Dear Monique<br>00:00:00.532            11 | 154156 | Cher Bebe'<br>00:00:00.532            12 | 168890 | Some Kinda Voodoo<br>00:00:00.532            13 | 186844 | Louisiana Rain<br>00:00:00.532            14 | 213499 | Just To Have My Girl<br>00:00:00.532<br>00:00:05.544     Ripping: device://cdda:0/1<br>00:00:05.572          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/01. Sweet Colinda.flac<br>00:00:05.573         Decoder: CDIO Ripper Component v2.1.0<br>00:00:05.574<br>00:00:35.531     Failed to verify input track: device://cdda:0/1<br>00:00:35.533         Track could not be verified as accurate:<br>00:00:35.533             Checksum (AccurateRip v1): cc9be0ad<br>00:00:35.534             Checksum (AccurateRip v2): 72886c87<br>00:00:35.535<br>00:00:35.564     Finished ripping: device://cdda:0/1<br>00:00:35.567         CRC checksum: 2f870c1a<br>00:00:35.568         Duration: 00:29.994 (6.1x speed)<br>00:00:35.568<br>00:00:35.580     Verifying: 01. Sweet Colinda.flac<br>00:00:35.581<br>00:00:36.231     Successfully verified output file: 01. Sweet Colinda.flac<br>00:00:36.232         MD5 hash: 7487b351e42b5e1717c3977b57382b60<br>00:00:36.232         Duration: 00:00.650 (283.4x speed)<br>00:00:36.233<br>00:00:36.356     Ripping: device://cdda:0/2<br>00:00:36.357          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/02. I Love My Baby And My Baby Loves Me.flac<br>00:00:36.358         Decoder: CDIO Ripper Component v2.1.0<br>00:00:36.359<br>00:01:08.723     Failed to verify input track: device://cdda:0/2<br>00:01:08.724         Track could not be verified as accurate:<br>00:01:08.725             Checksum (AccurateRip v1): dab1e4a2<br>00:01:08.725             Checksum (AccurateRip v2): c87e485a<br>00:01:08.726<br>00:01:08.733     Finished ripping: device://cdda:0/2<br>00:01:08.734         CRC checksum: e80d4c09<br>00:01:08.735         Duration: 00:32.375 (6.5x speed)<br>00:01:08.735<br>00:01:08.743     Verifying: 02. I Love My Baby And My Baby Loves Me.flac<br>00:01:08.744<br>00:01:09.546     Successfully verified output file: 02. I Love My Baby And My Baby Loves Me.flac<br>00:01:09.547         MD5 hash: 7b1fcbc8e59d490c2f8c92c9836d3215<br>00:01:09.548         Duration: 00:00.803 (264.0x speed)<br>00:01:09.549<br>00:01:09.671     Ripping: device://cdda:0/3<br>00:01:09.672          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/03. Chenier Tigre.flac<br>00:01:09.672         Decoder: CDIO Ripper Component v2.1.0<br>00:01:09.673<br>00:01:39.049     Failed to verify input track: device://cdda:0/3<br>00:01:39.050         Track could not be verified as accurate:<br>00:01:39.050             Checksum (AccurateRip v1): 5e32b970<br>00:01:39.051             Checksum (AccurateRip v2): 74fb39bc<br>00:01:39.051<br>00:01:39.057     Finished ripping: device://cdda:0/3<br>00:01:39.063         CRC checksum: c16a3b3d<br>00:01:39.064         Duration: 00:29.390 (7.1x speed)<br>00:01:39.065<br>00:01:39.080     Verifying: 03. Chenier Tigre.flac<br>00:01:39.081<br>00:01:39.977     Successfully verified output file: 03. Chenier Tigre.flac<br>00:01:39.978         MD5 hash: 94a6df1d2b5bf6c952526abf13f3d284<br>00:01:39.979         Duration: 00:00.895 (233.5x speed)<br>00:01:39.979<br>00:01:40.115     Ripping: device://cdda:0/4<br>00:01:40.116          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/04. Big Blue Tears.flac<br>00:01:40.116         Decoder: CDIO Ripper Component v2.1.0<br>00:01:40.117<br>00:02:07.763     Failed to verify input track: device://cdda:0/4<br>00:02:07.764         Track could not be verified as accurate:<br>00:02:07.764             Checksum (AccurateRip v1): f67ec0a7<br>00:02:07.765             Checksum (AccurateRip v2): 8f65649a<br>00:02:07.765<br>00:02:07.779     Finished ripping: device://cdda:0/4<br>00:02:07.780         CRC checksum: 3a866e6f<br>00:02:07.780         Duration: 00:27.663 (7.7x speed)<br>00:02:07.781<br>00:02:07.789     Verifying: 04. Big Blue Tears.flac<br>00:02:07.789<br>00:02:08.544     Successfully verified output file: 04. Big Blue Tears.flac<br>00:02:08.545         MD5 hash: 147e0fabff953694235e1f4ddfaeadb4<br>00:02:08.546         Duration: 00:00.756 (283.0x speed)<br>00:02:08.546<br>00:02:08.673     Ripping: device://cdda:0/5<br>00:02:08.673          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/05. Sometimes A Fiddle.flac<br>00:02:08.674         Decoder: CDIO Ripper Component v2.1.0<br>00:02:08.674<br>00:02:34.160     Failed to verify input track: device://cdda:0/5<br>00:02:34.160         Track could not be verified as accurate:<br>00:02:34.161             Checksum (AccurateRip v1): e61a75d4<br>00:02:34.161             Checksum (AccurateRip v2): 3939aa7b<br>00:02:34.162<br>00:02:34.176     Finished ripping: device://cdda:0/5<br>00:02:34.176         CRC checksum: e46ddcef<br>00:02:34.177         Duration: 00:25.502 (8.2x speed)<br>00:02:34.177<br>00:02:34.188     Verifying: 05. Sometimes A Fiddle.flac<br>00:02:34.188<br>00:02:34.927     Successfully verified output file: 05. Sometimes A Fiddle.flac<br>00:02:34.928         MD5 hash: 0a246de14b98ad6fd985d26be1997feb<br>00:02:34.928         Duration: 00:00.739 (284.3x speed)<br>00:02:34.928<br>00:02:35.055     Ripping: device://cdda:0/6<br>00:02:35.055          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/06. Giving Up The Ghost.flac<br>00:02:35.056         Decoder: CDIO Ripper Component v2.1.0<br>00:02:35.056<br>00:02:56.336     Failed to verify input track: device://cdda:0/6<br>00:02:56.336         Track could not be verified as accurate:<br>00:02:56.337             Checksum (AccurateRip v1): 0fc0b4ac<br>00:02:56.337             Checksum (AccurateRip v2): 0ecc7fb6<br>00:02:56.337<br>00:02:56.350     Finished ripping: device://cdda:0/6<br>00:02:56.350         CRC checksum: a581db6a<br>00:02:56.351         Duration: 00:21.295 (8.8x speed)<br>00:02:56.352<br>00:02:56.362     Verifying: 06. Giving Up The Ghost.flac<br>00:02:56.362<br>00:02:57.057     Successfully verified output file: 06. Giving Up The Ghost.flac<br>00:02:57.057         MD5 hash: 6b59d98b4e995ab157f46f0d2bd53210<br>00:02:57.058         Duration: 00:00.696 (268.7x speed)<br>00:02:57.058<br>00:02:57.185     Ripping: device://cdda:0/7<br>00:02:57.186          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/07. Riding On These Roses.flac<br>00:02:57.186         Decoder: CDIO Ripper Component v2.1.0<br>00:02:57.187<br>00:03:21.579     Failed to verify input track: device://cdda:0/7<br>00:03:21.580         Track could not be verified as accurate:<br>00:03:21.580             Checksum (AccurateRip v1): 34800c62<br>00:03:21.580             Checksum (AccurateRip v2): 816af701<br>00:03:21.581<br>00:03:21.592     Finished ripping: device://cdda:0/7<br>00:03:21.592         CRC checksum: 29cb736a<br>00:03:21.593         Duration: 00:24.406 (9.2x speed)<br>00:03:21.593<br>00:03:21.602     Verifying: 07. Riding On These Roses.flac<br>00:03:21.603<br>00:03:22.405     Successfully verified output file: 07. Riding On These Roses.flac<br>00:03:22.405         MD5 hash: f8e7edd374fccb80e3f5d5ab953ddb6d<br>00:03:22.406         Duration: 00:00.803 (278.3x speed)<br>00:03:22.410<br>00:03:22.548     Ripping: device://cdda:0/8<br>00:03:22.549          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/08. Hey Maman.flac<br>00:03:22.549         Decoder: CDIO Ripper Component v2.1.0<br>00:03:22.549<br>00:03:55.696     Failed to verify input track: device://cdda:0/8<br>00:03:55.697         Track could not be verified as accurate:<br>00:03:55.697             Checksum (AccurateRip v1): 4bba9921<br>00:03:55.698             Checksum (AccurateRip v2): 3f885b24<br>00:03:55.698<br>00:03:55.709     Finished ripping: device://cdda:0/8<br>00:03:55.709         CRC checksum: 37793a01<br>00:03:55.709         Duration: 00:33.159 (6.2x speed)<br>00:03:55.710<br>00:03:55.717     Verifying: 08. Hey Maman.flac<br>00:03:55.718<br>00:03:56.481     Successfully verified output file: 08. Hey Maman.flac<br>00:03:56.482         MD5 hash: 4171b52901602dbf4db9ff42b35c9209<br>00:03:56.482         Duration: 00:00.764 (268.0x speed)<br>00:03:56.483<br>00:03:56.604     Ripping: device://cdda:0/9<br>00:03:56.605          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/09. I Just Wanna Be Bayou.flac<br>00:03:56.605         Decoder: CDIO Ripper Component v2.1.0<br>00:03:56.606<br>00:04:24.602     Failed to verify input track: device://cdda:0/9<br>00:04:24.603         Track could not be verified as accurate:<br>00:04:24.603             Checksum (AccurateRip v1): 3236ae9f<br>00:04:24.604             Checksum (AccurateRip v2): a5b943ec<br>00:04:24.605<br>00:04:24.609     Finished ripping: device://cdda:0/9<br>00:04:24.609         CRC checksum: 9ca64955<br>00:04:24.609         Duration: 00:28.002 (7.7x speed)<br>00:04:24.610<br>00:04:24.619     Verifying: 09. I Just Wanna Be Bayou.flac<br>00:04:24.619<br>00:04:25.372     Successfully verified output file: 09. I Just Wanna Be Bayou.flac<br>00:04:25.373         MD5 hash: a6e3d56fbdc26dbd381c45a1ca757021<br>00:04:25.373         Duration: 00:00.753 (288.2x speed)<br>00:04:25.374<br>00:04:25.503     Ripping: device://cdda:0/10<br>00:04:25.503          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/10. My Dear Monique.flac<br>00:04:25.504         Decoder: CDIO Ripper Component v2.1.0<br>00:04:25.504<br>00:04:50.032     Failed to verify input track: device://cdda:0/10<br>00:04:50.033         Track could not be verified as accurate:<br>00:04:50.034             Checksum (AccurateRip v1): adba8e24<br>00:04:50.034             Checksum (AccurateRip v2): 684ecab7<br>00:04:50.034<br>00:04:50.041     Finished ripping: device://cdda:0/10<br>00:04:50.041         CRC checksum: 4973563a<br>00:04:50.042         Duration: 00:24.538 (7.8x speed)<br>00:04:50.042<br>00:04:50.061     Verifying: 10. My Dear Monique.flac<br>00:04:50.062<br>00:04:50.763     Successfully verified output file: 10. My Dear Monique.flac<br>00:04:50.764         MD5 hash: e49df7ca4fd28299d00147bbc48223d2<br>00:04:50.764         Duration: 00:00.701 (273.8x speed)<br>00:04:50.765<br>00:04:50.891     Ripping: device://cdda:0/11<br>00:04:50.891          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/11. Cher Bebe'.flac<br>00:04:50.892         Decoder: CDIO Ripper Component v2.1.0<br>00:04:50.892<br>00:05:16.198     Failed to verify input track: device://cdda:0/11<br>00:05:16.198         Track could not be verified as accurate:<br>00:05:16.199             Checksum (AccurateRip v1): 8d38eed8<br>00:05:16.199             Checksum (AccurateRip v2): 23adbf82<br>00:05:16.199<br>00:05:16.207     Finished ripping: device://cdda:0/11<br>00:05:16.207         CRC checksum: aa46c1be<br>00:05:16.208         Duration: 00:25.316 (7.8x speed)<br>00:05:16.208<br>00:05:16.219     Verifying: 11. Cher Bebe'.flac<br>00:05:16.220<br>00:05:16.980     Successfully verified output file: 11. Cher Bebe'.flac<br>00:05:16.981         MD5 hash: c440f1705b65df92032a7b33421f1cbf<br>00:05:16.984         Duration: 00:00.763 (257.5x speed)<br>00:05:16.984<br>00:05:17.120     Ripping: device://cdda:0/12<br>00:05:17.120          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/12. Some Kinda Voodoo.flac<br>00:05:17.121         Decoder: CDIO Ripper Component v2.1.0<br>00:05:17.121<br>00:05:47.920     Failed to verify input track: device://cdda:0/12<br>00:05:47.921         Track could not be verified as accurate:<br>00:05:47.922             Checksum (AccurateRip v1): ab852717<br>00:05:47.922             Checksum (AccurateRip v2): ce577d61<br>00:05:47.923<br>00:05:47.938     Finished ripping: device://cdda:0/12<br>00:05:47.942         CRC checksum: 6ff570b7<br>00:05:47.943         Duration: 00:30.822 (7.8x speed)<br>00:05:47.944<br>00:05:47.952     Verifying: 12. Some Kinda Voodoo.flac<br>00:05:47.953<br>00:05:48.877     Successfully verified output file: 12. Some Kinda Voodoo.flac<br>00:05:48.878         MD5 hash: feb14abeaba5101f06716a3315e5ea28<br>00:05:48.879         Duration: 00:00.925 (258.8x speed)<br>00:05:48.879<br>00:05:49.006     Ripping: device://cdda:0/13<br>00:05:49.013          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/13. Louisiana Rain.flac<br>00:05:49.014         Decoder: CDIO Ripper Component v2.1.0<br>00:05:49.015<br>00:06:34.685     Failed to verify input track: device://cdda:0/13<br>00:06:34.686         Track could not be verified as accurate:<br>00:06:34.686             Checksum (AccurateRip v1): 2208e6be<br>00:06:34.687             Checksum (AccurateRip v2): 0031f584<br>00:06:34.687<br>00:06:34.694     Finished ripping: device://cdda:0/13<br>00:06:34.694         CRC checksum: 1a626d25<br>00:06:34.695         Duration: 00:45.679 (7.8x speed)<br>00:06:34.695<br>00:06:34.703     Verifying: 13. Louisiana Rain.flac<br>00:06:34.704<br>00:06:35.903     Successfully verified output file: 13. Louisiana Rain.flac<br>00:06:35.904         MD5 hash: beee2d3fac7931ffbe65c61d92bc2c1f<br>00:06:35.904         Duration: 00:01.200 (296.2x speed)<br>00:06:35.905<br>00:06:36.035     Ripping: device://cdda:0/14<br>00:06:36.036          to: Waylon Thibodeaux/[2008] Who's Yo' Cher Bébé/14. Just To Have My Girl.flac<br>00:06:36.036         Decoder: CDIO Ripper Component v2.1.0<br>00:06:36.037<br>00:07:03.474     Failed to verify input track: device://cdda:0/14<br>00:07:03.475         Track could not be verified as accurate:<br>00:07:03.475             Checksum (AccurateRip v1): e6f45fd6<br>00:07:03.476             Checksum (AccurateRip v2): c17908d2<br>00:07:03.477<br>00:07:03.497     Finished ripping: device://cdda:0/14<br>00:07:03.497         CRC checksum: a6441014<br>00:07:03.497         Duration: 00:27.459 (7.8x speed)<br>00:07:03.500<br>00:07:03.500     0 of 14 tracks accurately ripped.<br>00:07:03.501<br>00:07:03.506     Verifying: 14. Just To Have My Girl.flac<br>00:07:03.507<br>00:07:04.122     Successfully verified output file: 14. Just To Have My Girl.flac<br>00:07:04.123         MD5 hash: 2468d018462872c745831ea7315723f9<br>00:07:04.123         Duration: 00:00.616 (346.0x speed)<br>00:07:04.125<br>00:07:04.125     0 of 14 tracks accurately ripped.<br>00:07:04.125<br>00:07:04.153 Conversion process finished.</div> </td> </tr> <tr> <th>Category:</th> <td> <a href="/get-posts/category:Music/" >Music</a > </td> </tr> <tr> <th>Size:</th> <td>369.7 MB</td> </tr> <tr> <th>Added:</th> <td>June 2, 2024, 12:19 a.m.</td> </tr> <tr> <th>Peers:</th> <td> Seeders: 1, Leechers: 1 <span class="text-muted small ms-2">(Last updated: 11 months, 2 weeks ago)</span> <button class="btn-small ms-2" id='peers'> <i class="fas fa-sync-alt"></i> Update </button> <div id="update-loader" class="spinner-border spinner-border-sm text-primary ms-2" style="display: none;"></div> </td> </tr> <tr> <th>Tracker Data:</th> <td> <div class="table-responsive"> <table class="table table-sm table-hover"> <thead class="bg-dark"> <tr> <th>Tracker</th> <th class="text-end">Seeders</th> <th class="text-end">Leechers</th> <th class="text-end">Completed</th> </tr> </thead> <tbody> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://open.stealth.si:80/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://exodus.desync.com:6969/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.cyberia.is:6969/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.opentrackr.org:1337/announce </td> <td class="text-end">1</td> <td class="text-end">0</td> <td class="text-end">3</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.torrent.eu.org:451/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr class="table-danger"> <td class="text-truncate" style="max-width: 350px;"> udp://explodie.org:6969/announce <span class="text-danger fw-bold">(Failed to scrape UDP tracker)</span> </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.birkenwald.de:6969/announce </td> <td class="text-end">0</td> <td class="text-end">1</td> <td class="text-end">0</td> </tr> <tr class="table-danger"> <td class="text-truncate" style="max-width: 350px;"> udp://tracker.moeking.me:6969/announce <span class="text-danger fw-bold">(Failed to scrape UDP tracker)</span> </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr class="table-danger"> <td class="text-truncate" style="max-width: 350px;"> udp://ipv4.tracker.harry.lu:80/announce <span class="text-danger fw-bold">(Failed to scrape UDP tracker)</span> </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.tiny-vps.com:6969/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.therarbg.to:6969/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> </tbody> </table> </div> </td> </tr> <tr> <th>Files:</th> <td> <div id="filelist" class="text-box"> <ol> <li> <span class="file-name">01. Sweet Colinda.flac</span> <span class="file-size">23.5 MB</span> </li> <li> <span class="file-name">02. I Love My Baby And My Baby Loves Me.flac</span> <span class="file-size">25.3 MB</span> </li> <li> <span class="file-name">03. Chenier Tigre.flac</span> <span class="file-size">26.7 MB</span> </li> <li> <span class="file-name">04. Big Blue Tears.flac</span> <span class="file-size">25.0 MB</span> </li> <li> <span class="file-name">05. Sometimes A Fiddle.flac</span> <span class="file-size">24.3 MB</span> </li> <li> <span class="file-name">06. Giving Up The Ghost.flac</span> <span class="file-size">23.3 MB</span> </li> <li> <span class="file-name">07. Riding On These Roses.flac</span> <span class="file-size">25.1 MB</span> </li> <li> <span class="file-name">08. Hey Maman.flac</span> <span class="file-size">23.6 MB</span> </li> <li> <span class="file-name">09. I Just Wanna Be Bayou.flac</span> <span class="file-size">26.3 MB</span> </li> <li> <span class="file-name">10. My Dear Monique.flac</span> <span class="file-size">22.4 MB</span> </li> <li> <span class="file-name">11. Cher Bebe'.flac</span> <span class="file-size">23.9 MB</span> </li> <li> <span class="file-name">12. Some Kinda Voodoo.flac</span> <span class="file-size">29.3 MB</span> </li> <li> <span class="file-name">13. Louisiana Rain.flac</span> <span class="file-size">44.3 MB</span> </li> <li> <span class="file-name">14. Just To Have My Girl.flac</span> <span class="file-size">26.3 MB</span> </li> <li> <span class="file-name">folder.jpg</span> <span class="file-size">346.4 KB</span> </li> <li> <span class="file-name">Waylon Thibodeaux - Who's Yo' Cher Bébé .cue</span> <span class="file-size">1.9 KB</span> </li> <li> <span class="file-name">Waylon Thibodeaux - Who's Yo' Cher Bébé .log</span> <span class="file-size">16.3 KB</span> </li> </div> </td> </tr> </table> <style> :root { --comment-bg: #ffffff; --comment-border: #edeff1; --comment-hover: #f6f7f8; --comment-text: #1c1c1c; --comment-meta: #787c7e; --primary-color: #0079d3; --secondary-color: #6c757d; --success-color: #46d160; --upvote-color: #ff4500; --downvote-color: #7193ff; --highlight-color: #eff6fb; --thread-line-color: #edeff1; } /* Dark mode variables */ .dark-mode { --comment-bg: #1a1a1b; --comment-border: #343536; --comment-hover: #272729; --comment-text: #d7dadc; --comment-meta: #818384; } /* Comment highlight effect when shared */ .comment-highlight { animation: highlight-pulse 2s ease-in-out; border-left: 3px solid var(--upvote-color) !important; } @keyframes highlight-pulse { 0% { background-color: rgba(255, 69, 0, 0.1); } 50% { background-color: rgba(255, 69, 0, 0.2); } 100% { background-color: transparent; } } --primary-color: #1484d6; --thread-line-color: #343536; --highlight-color: #2d3234; } .comment-section { font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif; max-width: 800px; margin: 0 auto; padding: 20px 0; } .comment-heading { font-size: 1.5rem; font-weight: 600; margin-bottom: 20px; color: var(--comment-text); border-bottom: 2px solid var(--comment-border); padding-bottom: 10px; } .comment-form { background-color: var(--comment-bg); border-radius: 8px; padding: 20px; margin-bottom: 30px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } .comment-form label { display: block; font-weight: 600; margin-bottom: 10px; color: var(--comment-text); } .comment-textarea { width: 100%; padding: 12px; border: 1px solid var(--comment-border); border-radius: 4px; resize: vertical; font-family: inherit; font-size: 14px; transition: border-color 0.2s; } .comment-textarea:focus { outline: none; border-color: var(--primary-color); box-shadow: 0 0 0 3px rgba(13, 110, 253, 0.25); } .comment-btn { background-color: #3760bb; color: white; border: none; padding: 10px 16px; border-radius: 4px; font-weight: 600; cursor: pointer; transition: background-color 0.2s; margin-top: 10px; } .comment-btn:hover { background-color: #0b5ed7; } .comment-btn:disabled { background-color: var(--secondary-color); cursor: not-allowed; } .comments-list { margin-top: 20px; } .comment-thread { margin-bottom: 15px; } .comment { display: flex; padding: 12px 16px; border-radius: 4px; background-color: var(--comment-bg); border: 1px solid var(--comment-border); margin-bottom: 8px; position: relative; transition: border-color 0.2s, box-shadow 0.2s; } .comment:hover { border-color: var(--primary-color); } .comment-thread { margin-bottom: 16px; position: relative; } .depth-1:before, .depth-2:before, .depth-3:before, .depth-4:before, .depth-5:before { content: ''; position: absolute; left: -16px; top: 0; bottom: 0; width: 2px; background-color: var(--thread-line-color); } .comment-avatar { width: 40px; height: 40px; border-radius: 50%; margin-right: 12px; flex-shrink: 0; } .comment-content { flex: 1; } .comment-header { display: flex; align-items: center; margin-bottom: 6px; } .comment-username { font-weight: 600; color: var(--comment-text); margin-right: 8px; } .comment-time { font-size: 12px; color: var(--comment-meta); } .comment-body { color: var(--comment-text); line-height: 1.5; margin-bottom: 8px; word-wrap: break-word; } .vote-wrapper { display: flex; flex-direction: column; align-items: center; margin-right: 10px; min-width: 30px; } .vote-button { background: none; border: none; cursor: pointer; color: var(--comment-meta); padding: 2px; transition: color 0.2s; } .vote-button.upvote:hover, .vote-button.active.upvote { color: var(--upvote-color); } .vote-button.downvote:hover, .vote-button.active.downvote { color: var(--downvote-color); } .vote-count { font-size: 12px; font-weight: 600; text-align: center; margin: 2px 0; color: var(--comment-text); } .comment-actions { display: flex; gap: 12px; margin-top: 8px; } .comment-action { font-size: 12px; color: var(--comment-meta); cursor: pointer; transition: color 0.2s; background: none; border: none; padding: 0; display: flex; align-items: center; } .comment-action:hover { color: var(--primary-color); } .comment-action i { margin-right: 4px; font-size: 13px; } .reply-form { margin-top: 12px; margin-bottom: 12px; background-color: white; border-radius: 8px; padding: 12px; box-shadow: 0 1px 3px rgba(0, 0, 0, 0.1); } .reply-form textarea { font-size: 14px; } .depth-0 { margin-left: 0; } .depth-1 { margin-left: 40px; } .depth-2 { margin-left: 80px; } .depth-3 { margin-left: 120px; } .depth-4 { margin-left: 160px; } .depth-5 { margin-left: 200px; } @media (max-width: 768px) { .comment-section { padding: 10px; } .depth-3, .depth-4, .depth-5 { margin-left: 60px; } } </style> <div class="comment-section"> <div class="container"> <hr class="my-4" /> <h3 class="comment-heading">Discussion</h3> <div class="comment-form"> <label for="comm1">Leave a comment</label> <textarea rows="4" class="comment-textarea" id="comm1" placeholder="What are your thoughts?" required></textarea> <button id="comBtn" class="comment-btn" onclick="submitData('')"> <i class="fas fa-paper-plane"></i> Submit Comment </button> </div> <div id="commrow" class="comments-list"></div> </div> <script> const token = JSON.parse(localStorage.getItem("token")); const now = new Date(); // Store user votes in local storage to remember which comments were voted on const userVotes = JSON.parse(localStorage.getItem("userVotes") || "{}"); // Store saved comments in local storage const savedComments = JSON.parse(localStorage.getItem("savedComments") || "{}"); // Function to sanitize content and prevent XSS attacks function sanitizeHTML(text) { if (!text) return ""; const element = document.createElement('div'); element.textContent = text; return element.innerHTML; } // Function to detect potential malicious content function hasScriptContent(text) { if (!text) return false; const lowerText = text.toLowerCase(); const suspicious = [ '<script', 'javascript:', 'onerror=', 'onload=', 'onclick=', 'onmouseover=', 'eval(', 'document.cookie', 'alert(', 'localStorage' ]; return suspicious.some(term => lowerText.includes(term)); } // Handle vote (upvote or downvote) function handleVote(buttonElement, isUpvote) { if (!token?.access) { alert("You need to log in to vote on comments."); localStorage.setItem("prevpath", window.location.pathname); window.open("/auth/login/", "_self"); return; } const commentId = buttonElement.getAttribute("data-comment-id"); const voteCountElement = document.getElementById(`vote-count-${commentId}`); const currentCount = parseInt(voteCountElement.textContent) || 0; // Find upvote and downvote buttons for this comment const upvoteButton = document.querySelector(`.vote-button.upvote[data-comment-id="${commentId}"]`); const downvoteButton = document.querySelector(`.vote-button.downvote[data-comment-id="${commentId}"]`); // Get previous vote status const previousVote = userVotes[commentId] || null; // null means no vote let voteValue = 0; // Determine the new vote value based on what the user clicked and previous state if (isUpvote) { // If already upvoted, remove the upvote (toggle off) if (previousVote === 'up') { voteValue = 0; userVotes[commentId] = null; upvoteButton.classList.remove("active"); voteCountElement.textContent = currentCount - 1; } else { // If downvoted, remove downvote and add upvote (change direction) if (previousVote === 'down') { voteValue = 1; userVotes[commentId] = 'up'; downvoteButton.classList.remove("active"); upvoteButton.classList.add("active"); voteCountElement.textContent = currentCount + 2; // +2 because we're removing a downvote (-1) and adding an upvote (+1) } else { // Otherwise, add a new upvote voteValue = 1; userVotes[commentId] = 'up'; upvoteButton.classList.add("active"); voteCountElement.textContent = currentCount + 1; } } } else { // Similar logic for downvote if (previousVote === 'down') { voteValue = 0; userVotes[commentId] = null; downvoteButton.classList.remove("active"); voteCountElement.textContent = currentCount + 1; // Remove downvote effect } else { if (previousVote === 'up') { voteValue = -1; userVotes[commentId] = 'down'; upvoteButton.classList.remove("active"); downvoteButton.classList.add("active"); voteCountElement.textContent = currentCount - 2; } else { voteValue = -1; userVotes[commentId] = 'down'; downvoteButton.classList.add("active"); voteCountElement.textContent = currentCount - 1; } } } // Save the updated votes to localStorage localStorage.setItem("userVotes", JSON.stringify(userVotes)); // Send the vote to the server submitVote(commentId, voteValue); } // Send the vote to the server to update in PostgreSQL and Redis cache function submitVote(commentId, value) { if (!token?.access) return; const data = { comment_id: commentId, vote_value: value // 1 for upvote, -1 for downvote, 0 for removing vote }; apiRequest("/api/v1/comment/vote/", { method: "POST", body: JSON.stringify(data) }) .then(response => { if (!response.ok) { throw new Error(`HTTP error! Status: ${response.status}`); } return response.json(); }) .then(data => { // Update UI with server-calculated vote count if provided if (data && data.current_vote_count !== undefined) { const voteCountElement = document.getElementById(`vote-count-${commentId}`); if (voteCountElement) { voteCountElement.textContent = data.current_vote_count; // Find the comment container to potentially reorder it const commentContainer = document.getElementById(`comment-${commentId}`); if (commentContainer) { const parentContainer = commentContainer.parentElement; // Only re-sort if this is a top-level comment (direct child of comments-list) if (parentContainer && parentContainer.classList.contains('comments-list')) { // Get all direct child comments in this container const siblingComments = Array.from(parentContainer.children); // Sort them by vote count (descending) siblingComments.sort((a, b) => { const aVotes = parseInt(a.querySelector('.vote-count').textContent) || 0; const bVotes = parseInt(b.querySelector('.vote-count').textContent) || 0; return bVotes - aVotes; // Higher votes first }); // Reorder comments based on votes siblingComments.forEach(comment => parentContainer.appendChild(comment)); } } } } }) .catch(error => { console.error("Error updating vote:", error); }); } // Copy a link to the comment to clipboard function copyCommentLink(commentId, event) { // Get the button that was clicked const shareButton = event?.currentTarget || document.querySelector(`.comment-action[onclick*="copyCommentLink('${commentId}')"]`); const commentUrl = `${window.location.origin}${window.location.pathname}#comment-${commentId}`; // First, try to scroll to the comment to highlight it const commentElement = document.getElementById(`comment-${commentId}`); if (commentElement) { // Add a highlight class to the comment commentElement.classList.add('comment-highlight'); // Scroll the comment into view with smooth behavior commentElement.scrollIntoView({ behavior: 'smooth', block: 'center' }); // Remove the highlight after a few seconds setTimeout(() => { commentElement.classList.remove('comment-highlight'); }, 3000); } // Try multiple methods to copy to clipboard for better browser compatibility function showCopySuccess(shareButton) { // First, show feedback on the button itself if (shareButton) { const originalText = shareButton.innerHTML; shareButton.innerHTML = '<i class="fas fa-check"></i> Link Copied!'; setTimeout(() => { shareButton.innerHTML = originalText; }, 2000); } // Also show a tooltip message const tooltip = document.createElement('div'); tooltip.className = 'tooltip'; tooltip.textContent = 'Link copied to clipboard!'; tooltip.style.position = 'fixed'; tooltip.style.top = '50%'; tooltip.style.left = '50%'; tooltip.style.transform = 'translate(-50%, -50%)'; tooltip.style.padding = '8px 16px'; tooltip.style.background = 'rgba(0,0,0,0.7)'; tooltip.style.color = 'white'; tooltip.style.borderRadius = '4px'; tooltip.style.zIndex = '9999'; document.body.appendChild(tooltip); setTimeout(() => { document.body.removeChild(tooltip); }, 2000); } // Method 1: Modern clipboard API if (navigator.clipboard && navigator.clipboard.writeText) { navigator.clipboard.writeText(commentUrl) .then(() => showCopySuccess(shareButton)) .catch(err => { // Fall back to method 2 if method 1 fails fallbackCopyTextToClipboard(commentUrl); }); } else { // Method 2: Fallback for older browsers fallbackCopyTextToClipboard(commentUrl); } // Fallback method using document.execCommand function fallbackCopyTextToClipboard(text) { const textArea = document.createElement('textarea'); textArea.value = text; // Make the textarea out of viewport textArea.style.position = 'fixed'; textArea.style.left = '-999999px'; textArea.style.top = '-999999px'; document.body.appendChild(textArea); // Focus and select the text textArea.focus(); textArea.select(); try { const successful = document.execCommand('copy'); if (successful) { showCopySuccess(shareButton); } else { alert('Failed to copy link. Please try again or copy this URL manually: ' + commentUrl); } } catch (err) { console.error('Failed to copy: ', err); alert('Failed to copy link. Please try again or copy this URL manually: ' + commentUrl); } document.body.removeChild(textArea); } } // Toggle saved state for a comment function toggleSaved(commentId) { if (!token?.access) { alert("You need to log in to save comments."); localStorage.setItem("prevpath", window.location.pathname); window.open("/auth/login/", "_self"); return; } const bookmarkIcon = document.getElementById(`bookmark-${commentId}`); const isSaved = savedComments[commentId]; if (isSaved) { // Unsave comment delete savedComments[commentId]; bookmarkIcon.classList.remove('fas'); bookmarkIcon.classList.add('far'); } else { // Save comment savedComments[commentId] = true; bookmarkIcon.classList.remove('far'); bookmarkIcon.classList.add('fas'); } // Save to localStorage localStorage.setItem("savedComments", JSON.stringify(savedComments)); // Could also send to server if you want to persist across devices // saveSavedCommentToServer(commentId, !isSaved); } $(document).ready(function () { fetchCommentData("76e122"); // Apply dark mode if user has it enabled if (localStorage.getItem('darkMode') === 'true') { document.body.classList.add('dark-mode'); } // Initialize dark mode toggle if one exists on the page const darkModeToggle = document.getElementById('dark-mode-toggle'); if (darkModeToggle) { darkModeToggle.addEventListener('click', function() { document.body.classList.toggle('dark-mode'); const isDarkMode = document.body.classList.contains('dark-mode'); localStorage.setItem('darkMode', isDarkMode); }); } }); // Initialize UI after comments are loaded to show proper vote states and saved states function initializeCommentUI() { // Set up vote buttons based on user's previous votes Object.keys(userVotes).forEach(commentId => { const voteType = userVotes[commentId]; if (voteType === 'up') { const upvoteButton = document.querySelector(`.vote-button.upvote[data-comment-id="${commentId}"]`); if (upvoteButton) upvoteButton.classList.add('active'); } else if (voteType === 'down') { const downvoteButton = document.querySelector(`.vote-button.downvote[data-comment-id="${commentId}"]`); if (downvoteButton) downvoteButton.classList.add('active'); } }); // Set up saved state for comments Object.keys(savedComments).forEach(commentId => { if (savedComments[commentId]) { const bookmarkIcon = document.getElementById(`bookmark-${commentId}`); if (bookmarkIcon) { bookmarkIcon.classList.remove('far'); bookmarkIcon.classList.add('fas'); } } }); // If there's a comment ID in the URL hash, scroll to it and highlight it setTimeout(() => { const hash = window.location.hash; if (hash && hash.startsWith('#comment-')) { const commentId = hash.substring('#comment-'.length); const commentElement = document.getElementById(`comment-${commentId}`); console.log('Looking for comment:', commentId, 'Element found:', commentElement); if (commentElement) { // Add a stronger highlight animation commentElement.classList.add('comment-highlight'); // Scroll to the comment with a longer delay to ensure DOM is fully rendered setTimeout(() => { // First scroll to approximate position to ensure element is in viewport window.scrollTo({ top: commentElement.offsetTop - 200, behavior: 'auto' }); // Then do a more precise scroll with smooth behavior setTimeout(() => { commentElement.scrollIntoView({ behavior: 'smooth', block: 'center' }); }, 100); }, 500); // Remove the highlight after a few seconds setTimeout(() => { commentElement.classList.remove('comment-highlight'); }, 5000); } } }, 1000); // Increased delay to ensure comments are fully loaded } function formatTimestamp(timestamp) { if (!timestamp) return ""; const commentDate = new Date(timestamp); const diffMs = now - commentDate; const diffSecs = Math.floor(diffMs / 1000); const diffMins = Math.floor(diffSecs / 60); const diffHours = Math.floor(diffMins / 60); const diffDays = Math.floor(diffHours / 24); if (diffSecs < 60) return "just now"; if (diffMins < 60) return `${diffMins} minute${diffMins !== 1 ? 's' : ''} ago`; if (diffHours < 24) return `${diffHours} hour${diffHours !== 1 ? 's' : ''} ago`; if (diffDays < 7) return `${diffDays} day${diffDays !== 1 ? 's' : ''} ago`; // If older than a week, show the date return commentDate.toLocaleDateString(); } function showHide(val, id) { // Hide all reply forms first $(".reply-form").css({ display: "none" }); // Toggle the clicked reply form if ($("#" + id).css("display") === "block") { $("#" + id).css({ display: "none" }); } else { $("#" + id).css({ display: val }); $("#com" + id.replace("commDiv", "")).focus(); } } function fetchCommentData(search) { $.get( `/api/v1/comment/tree/${search}/`, (data, status) => { if (data?.length > 0) { createCommentHtml(data); // Initialize UI after comments are loaded initializeCommentUI(); } else { document.getElementById("commrow").innerHTML = "<div class='text-center py-4'><p class='text-muted'>No comments yet. Be the first to comment!</p></div>"; } } ).fail(function() { document.getElementById("commrow").innerHTML = "<div class='text-center py-4'><p class='text-danger'>Failed to load comments. Please try again later.</p></div>"; }); } const submitData = async (id) => { const commentText = id ? $.trim($("#com" + id).val()) : $.trim($("#comm1").val()); // Prevent empty or excessively long comments if (!commentText) { return; // Don't submit empty comments } // Maximum comment length (adjust as needed) if (commentText.length > 5000) { alert("Comment is too long. Please keep it under 5000 characters."); return; } const data = { etrb_post_id: "76e122", comment: commentText, parent: Number(id), }; if (!id) { delete data.parent; } // Check for potentially malicious content before sending if (hasScriptContent(data.comment)) { alert("Your comment contains potentially unsafe content that is not allowed."); return; } const btnId = "comBtn" + (id || ""); document.getElementById(btnId).disabled = true; document.getElementById(btnId).innerHTML = "<i class='fas fa-spinner fa-spin'></i> Submitting..."; try { // Use the apiClient to make the request with automatic token refresh const response = await window.apiClient.apiPost('/api/v1/comment/create/', data); // Clear the textarea id ? $("#com" + id).val("") : $("#comm1").val(""); // Hide reply form if it was a reply if (id) { $("#commDiv" + id).css({ display: "none" }); } // Refresh comments fetchCommentData("76e122"); } catch (error) { console.error("Comment submission error:", error); if (error.message && !error.message.includes('401') && !error.message.includes('403')) { alert("Failed to submit comment. Please try again."); } } finally { document.getElementById(btnId).disabled = false; document.getElementById(btnId).innerHTML = id ? "Reply" : "<i class='fas fa-paper-plane'></i> Submit Comment"; } }; function createCommentHtml(list) { if (list.length === 0) { document.getElementById("commrow").innerHTML = "<div class='text-center py-4'><p class='text-muted'>No comments yet. Be the first to comment!</p></div>"; return; } // Group comments by parent to build a tree structure const commentsByParent = {}; list.forEach(post => { const parentId = post.tree_path && post.tree_path.length > 1 ? post.tree_path[post.tree_path.length - 2] : 0; if (!commentsByParent[parentId]) { commentsByParent[parentId] = []; } commentsByParent[parentId].push(post); }); // Function to build comment HTML with proper nesting function buildCommentTree(parentId = 0, nestLevel = 0) { let treeHtml = ''; const children = commentsByParent[parentId] || []; children.forEach(post => { // Format timestamp (assuming post has created timestamp in ISO format) const timestamp = formatTimestamp(post.created); const depthClass = `depth-${Math.min(nestLevel, 5)}`; const voteCount = post.votes || 0; treeHtml += ` <div id="comment-${post.id}" class="comment-thread ${depthClass}"> <div class="comment"> <div class="vote-wrapper"> <button class="vote-button upvote" title="Upvote" data-comment-id="${post.id}" onclick="handleVote(this, true)"> <i class="fas fa-arrow-up"></i> </button> <span class="vote-count" id="vote-count-${post.id}">${voteCount}</span> <button class="vote-button downvote" title="Downvote" data-comment-id="${post.id}" onclick="handleVote(this, false)"> <i class="fas fa-arrow-down"></i> </button> </div> <img src="https://ui-avatars.com/api/?name=${encodeURIComponent(post?.info?.username || 'User')}&background=random" alt="${sanitizeHTML(post?.info?.username || 'User')}" class="comment-avatar" /> <div class="comment-content"> <div class="comment-header"> <span class="comment-username">${sanitizeHTML(post?.info?.username || "Anonymous")}</span> <span class="comment-time">${timestamp}</span> </div> <div class="comment-body"> ${sanitizeHTML(post?.comment || "")} </div> <div class="comment-actions"> <button class="comment-action" onClick="showHide('block','commDiv${post?.id}')"> <i class="fas fa-reply"></i> Reply </button> <button class="comment-action" onClick="copyCommentLink('${post.id}', event)"> <i class="fas fa-link"></i> Share </button> <button class="comment-action" onClick="toggleSaved('${post.id}')"> <i class="far fa-bookmark" id="bookmark-${post.id}"></i> Save </button> </div> <div id="commDiv${post?.id}" class="reply-form" style="display:none;"> <textarea rows="3" class="comment-textarea" id="com${post?.id}" placeholder="What are your thoughts?" required ></textarea> <div class="d-flex justify-content-between mt-2"> <button class="comment-btn" id="comBtn${post?.id}" onclick="submitData('${post?.id}')">Reply</button> <button class="comment-action" onclick="showHide('none','commDiv${post?.id}')">Cancel</button> </div> </div> </div> </div> ${commentsByParent[post.id] ? buildCommentTree(post.id, nestLevel + 1) : ''} </div>`; }); return treeHtml; } // Build the entire comment tree starting from root comments const inhtml = buildCommentTree(); document.getElementById("commrow").innerHTML = inhtml; } </script> </div> <div class="row"> <div style="text-align: center; padding-top:20px"><button class="btn-small" onclick="history.back()" ><i class="fas fa-arrow-left"></i> Back</button></div> </div> </div> <br /> </div> </div> <div id="imgModal" class="modal"> <img class="modal-content" id="imgContent"> </div> <!-- Add modal for tracker details --> <div class="modal fade" id="trackerModal" tabindex="-1" role="dialog" aria-labelledby="trackerModalLabel" aria-hidden="true"> <div class="modal-dialog modal-dialog-centered modal-lg"> <div class="modal-content"> <div class="modal-header bg-primary text-white"> <h5 class="modal-title" id="trackerModalLabel">Tracker Details</h5> <button type="button" class="btn-close btn-close-white" data-bs-dismiss="modal" aria-label="Close"></button> </div> <div class="modal-body"> <div id="trackerDetails"> <!-- Content will be populated by JS --> </div> </div> <div class="modal-footer"> <button type="button" class="btn btn-secondary" data-bs-dismiss="modal"> <i class="fas fa-times me-1"></i> Close </button> </div> </div> </div> </div> <div class="adCont row"> <div class="me-auto text-center"> </div> </div> <script> // Get the modal var modal = document.getElementById("imgModal"); var modalImg = document.getElementById("imgContent"); function showModal(url){ modal.style.display = "block"; modalImg.src = url; } // Get the <span> element that closes the modal modal.onclick = function() { modal.style.display = "none"; } $(document).ready(function() { $('#trackerModal').modal({show: false}); // Add proper close handlers $('#trackerModal').on('hidden.bs.modal', function () { $(this).find('.modal-body').scrollTop(0); }); // Check for potentially dangerous file extensions and show warning if found function checkForLnkFiles() { const dangerousExtensions = ['.lnk', '.001', '.arj', '.src', '.scr']; const fileElements = document.querySelectorAll('.file-name'); for (let i = 0; i < fileElements.length; i++) { let fileName = fileElements[i].textContent.toLowerCase(); // Handle case where fileName might be an array if (Array.isArray(fileName)) { // If it's an array, use the first element fileName = fileName[0].toLowerCase(); } else if (typeof fileName === 'string' && fileName.startsWith('[') && fileName.endsWith(']')) { // Extract the content from within brackets for array-like strings // This handles both single and double quoted strings const content = fileName.substring(1, fileName.length - 1).trim(); // If it starts with a quote (single or double), extract the string content if ((content.startsWith("'") && content.endsWith("'")) || (content.startsWith('"') && content.endsWith('"'))) { // Remove the quotes and use this as the filename fileName = content.substring(1, content.length - 1).toLowerCase(); } else { // Try standard JSON parsing as a fallback try { // Convert single quotes to double quotes for valid JSON const jsonStr = fileName.replace(/'/g, '"'); const parsedArray = JSON.parse(jsonStr); if (Array.isArray(parsedArray) && parsedArray.length > 0) { fileName = parsedArray[0].toLowerCase(); } } catch (e) { // If all parsing fails, just use the content without brackets console.log('Using raw content from brackets after parsing failed'); fileName = content; } } } // Check if file ends with any of the dangerous extensions for (let j = 0; j < dangerousExtensions.length; j++) { // console.log('Checking file extension:', fileName, dangerousExtensions[j]); if (fileName.endsWith(dangerousExtensions[j])) { document.getElementById('lnk-warning').style.display = 'table-row'; return; // Exit the function once we find a match } } } } // Run the check when page loads checkForLnkFiles(); }); function showTrackerModal(result) { // Format tracker details let trackerHtml = ` <div class="mb-3"> <h6 class="text-primary">Current Summary</h6> <div class="row"> <div class="col-4"><strong>Seeders:</strong></div> <div class="col-8">${result.seeders}</div> </div> <div class="row"> <div class="col-4"><strong>Leechers:</strong></div> <div class="col-8">${result.leechers}</div> </div> <div class="row"> <div class="col-4"><strong>Completed:</strong></div> <div class="col-8">${result.completed}</div> </div> </div> <div class="mb-3"> <h6 class="text-primary">Last Saved Data</h6> <div class="row"> <div class="col-4"><strong>Seeders:</strong></div> <div class="col-8">1</div> </div> <div class="row"> <div class="col-4"><strong>Leechers:</strong></div> <div class="col-8">1</div> </div> <div class="row"> <div class="col-4"><strong>Completed:</strong></div> <div class="col-8">3</div> </div> <div class="row"> <div class="col-4"><strong>Last Updated:</strong></div> <div class="col-8">11 months, 2 weeks ago</div> </div> </div> <hr> <h6 class="text-primary">Current Tracker Breakdown</h6> <div class="table-responsive"> <table class="table table-sm table-hover"> <thead class="bg-dark"> <tr> <th>Tracker</th> <th class="text-end">Seeders</th> <th class="text-end">Leechers</th> <th class="text-end">Completed</th> </tr> </thead> <tbody> ${result.trackers.map(tracker => ` <tr ${tracker.scrape_error ? 'class="table-danger"' : ''}> <td class="text-truncate" style="max-width: 350px;"> ${tracker.tracker} ${tracker.scrape_error ? `<span class="text-danger fw-bold">(${tracker.scrape_error})</span>` : ''} </td> <td class="text-end">${tracker.seeders}</td> <td class="text-end">${tracker.leechers}</td> <td class="text-end">${tracker.completed}</td> </tr> `).join('')} </tbody> </table> </div> <hr> <h6 class="text-primary">Saved Tracker Data</h6> <div class="table-responsive"> <table class="table table-sm table-hover"> <thead class="bg-dark"> <tr> <th>Tracker</th> <th class="text-end">Seeders</th> <th class="text-end">Leechers</th> <th class="text-end">Completed</th> </tr> </thead> <tbody> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://open.stealth.si:80/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://exodus.desync.com:6969/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.cyberia.is:6969/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.opentrackr.org:1337/announce </td> <td class="text-end">1</td> <td class="text-end">0</td> <td class="text-end">3</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.torrent.eu.org:451/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr class="table-danger"> <td class="text-truncate" style="max-width: 350px;"> udp://explodie.org:6969/announce <span class="text-danger fw-bold">(Failed to scrape UDP tracker)</span> </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.birkenwald.de:6969/announce </td> <td class="text-end">0</td> <td class="text-end">1</td> <td class="text-end">0</td> </tr> <tr class="table-danger"> <td class="text-truncate" style="max-width: 350px;"> udp://tracker.moeking.me:6969/announce <span class="text-danger fw-bold">(Failed to scrape UDP tracker)</span> </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr class="table-danger"> <td class="text-truncate" style="max-width: 350px;"> udp://ipv4.tracker.harry.lu:80/announce <span class="text-danger fw-bold">(Failed to scrape UDP tracker)</span> </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.tiny-vps.com:6969/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> <tr > <td class="text-truncate" style="max-width: 350px;"> udp://tracker.therarbg.to:6969/announce </td> <td class="text-end">0</td> <td class="text-end">0</td> <td class="text-end">0</td> </tr> </tbody> </table> </div> `; $('#trackerDetails').html(trackerHtml); $('#trackerModal').modal('show'); } $("#peers").click(function(e) { e.preventDefault(); $("#peers").prop('disabled', true); $("#peers").html('<i class="fas fa-sync-alt fa-spin"></i> Updating...'); $("#update-loader").show(); $.ajax({ type: "GET", url: "/utils/api/v1/update-torrent-stats/542B4D2FEE75293567F16CEB55E8C3C4423AA467/", success: function(result) { $("#update-loader").hide(); $("#peers").prop('disabled', false); $("#peers").html('<i class="fas fa-sync-alt"></i> Update'); showTrackerModal(result); $('.modal-backdrop').remove(); }, error: function(xhr) { $("#update-loader").hide(); $("#peers").prop('disabled', false); $("#peers").html('<i class="fas fa-sync-alt"></i> Update'); alert('Error updating peers: ' + xhr.responseText); } }); }); function copy(text, target) { navigator.clipboard.writeText(text); const originalText = $(target).html(); $(target).html('<i class="fas fa-check"></i> Copied!').addClass('copied'); // Update download counter via AJAX (optional) $.ajax({ type: "POST", url: "/utils/api/v1/increment-downloads/542B4D2FEE75293567F16CEB55E8C3C4423AA467/", success: function(response) { // Silently update counter if available if(response && response.downloads) { $('#download-count').text(response.downloads); } } }); setTimeout(() => { $(target).html(originalText).removeClass('copied'); }, 2000); } $(document).ready(function() { $('.sortableTable2').DataTable({ paging: false, bFilter: false // language: { // search: "_INPUT_", // searchPlaceholder: "Search table..." // } }); }); </script> <script src="/static/vendor/js/bootstrap.bundle.min.js" defer></script> <script src="/static/rarbg/css/jquery-ui.js?v=1.04" defer></script> <script src="/static/rarbg/css/slick.min.js?v=1.04" defer></script> <script src="/static/js/api-client.js?v=1.0"></script> </body> <footer class="row align-center"> <div style="text-align: center; color: white;margin-top: 20px;"> <a class="anal tdlinkfull" href="/" target="_blank" style="color: white; text-decoration: underline" >Home</a > | <a class="anal tdlinkfull" href="/about-us/" style="color: white; text-decoration: underline" >About us</a > | <a class="anal tdlinkfull" href="/latest/rss/" target="_blank" style="color: white; text-decoration: underline" >RSS</a > | <a class="anal tdlinkfull" href="https://thepiratebayproxy.github.io/" target="_blank" style="color: white; text-decoration: underline" >TPB Proxy</a > | <a class="anal tdlinkfull" href="https://therarbg.com/discord/" target="_blank" style="color: white; text-decoration: underline" >Discord</a > | <a class="anal tdlinkfull" href="https://www.reddit.com/r/TheRarBg/" target="_blank" style="color: white; text-decoration: underline" >Reddit</a > <br /> </div> <br /> <div style="text-align: center; color: white; font-size: 11px;"> Donation ETH Address: 0x5C8Ba662A48811B52D8A24074569A10B03245bf9 </div> <br /> <div style="text-align: center; color: white"> <p> © 2025 The RarBg. All rights reserved.</p> </div> </footer> </html>