[{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-54 мин."},"isBanned":false,"roleString":"Мастер-Эксперт","roleIcon":"fa-user-ninja","socialMedia":[],"aboutText":"","aboutHTML":"","signatureText":"Facta loquuntur.","signatureHTML":"Facta loquuntur.","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":4.979,"absoluteRating":109927,"dynamicRating":1676.476,"dynamicRatingStars":10,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-04-30T15:54:59.5216618+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":11,"counters":{"daysAtPortal":6557,"questions":12,"questionsPosts":18345,"questionsAnswers":6663,"questionsPostsEvaluations":2831,"forumPosts":5698},"isRfproUserClass":true,"id":17387,"name":"Гордиенко Андрей Владимирович","email":"","role":10,"registDate":"1000-01-01T00:00:00","lastDate":"2024-04-29T08:02:54","photo":"users/17387/f4979bc95a484b9f43f75cfe66538acd.jpg","lastDateIndicatorClass":"red","lastDateIndicatorText":"давно","photoPreview200":"users/17387/200_f4979bc95a484b9f43f75cfe66538acd.jpg","photoPreview120":"users/17387/120_f4979bc95a484b9f43f75cfe66538acd.jpg","photoPreview100":"users/17387/100_f4979bc95a484b9f43f75cfe66538acd.jpg","photoPreview80":"users/17387/80_f4979bc95a484b9f43f75cfe66538acd.jpg","photoPreview40":"users/17387/40_f4979bc95a484b9f43f75cfe66538acd.jpg","isPhotoExists":true,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":true},{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-54 мин."},"isBanned":false,"roleString":"Мастер-Эксперт","roleIcon":"fa-user-ninja","socialMedia":[],"aboutText":"Я пенсионер. Образование высш, радио-инж. Работал инж-электроником, ведущим средств телевидения, связи, слесарем и инженером КИП, грузчиком, программистом. На моём счету десятки рац-предложений, в тч с большим экономич эффектом.\nЯ люблю компьютеры, ремонтирую их друзьям и соседям. Пишу полезные программки в vbs-файлах, автоматизирующие настройку Win-систем, приложений и работу с ними.","aboutHTML":"Я пенсионер. Образование высш, радио-инж. Работал инж-электроником, ведущим средств телевидения, связи, слесарем и инженером КИП, грузчиком, программистом. На моём счету десятки рац-предложений, в тч с большим экономич эффектом.\u003Cbr\u003EЯ люблю компьютеры, ремонтирую их друзьям и соседям. Пишу полезные программки в vbs-файлах, автоматизирующие настройку Win-систем, приложений и работу с ними.","signatureText":"","signatureHTML":"","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":4.935,"absoluteRating":25753,"dynamicRating":460.744,"dynamicRatingStars":8,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-04-30T15:54:59.5219555+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":11,"counters":{"daysAtPortal":5589,"questions":25,"questionsPosts":7459,"questionsAnswers":1225,"questionsPostsEvaluations":788,"forumPosts":399},"isRfproUserClass":true,"id":259041,"name":"Алексеев Владимир Николаевич","email":"","role":10,"registDate":"1000-01-01T00:00:00","lastDate":"2024-01-30T15:24:45","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":true},{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-54 мин."},"isBanned":false,"roleString":"Старший Модератор","roleIcon":"fa-user-tie","socialMedia":[],"aboutText":"634034, г.Томск, ул.Красноармейская 122, кв.173","aboutHTML":"634034, г.Томск, ул.Красноармейская 122, кв.173","signatureText":"","signatureHTML":"","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":4.985,"absoluteRating":21746,"dynamicRating":412.329,"dynamicRatingStars":8,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-04-30T15:54:59.5220391+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":13,"counters":{"daysAtPortal":5274,"questions":1,"questionsPosts":1973,"questionsAnswers":1283,"questionsPostsEvaluations":588,"forumPosts":91},"isRfproUserClass":true,"id":312929,"name":"Коцюрбенко Алексей Владимирович","email":"","role":12,"registDate":"1000-01-01T00:00:00","lastDate":"2023-11-05T17:20:40","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":true},{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-54 мин."},"isBanned":false,"roleString":"Советник","roleIcon":"fa-user-ninja","socialMedia":[],"aboutText":"","aboutHTML":"","signatureText":"","signatureHTML":"","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":5,"absoluteRating":9460,"dynamicRating":386.593,"dynamicRatingStars":8,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-04-30T15:54:59.5221+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":10,"counters":{"daysAtPortal":2447,"questions":0,"questionsPosts":472,"questionsAnswers":398,"questionsPostsEvaluations":298,"forumPosts":1},"isRfproUserClass":true,"id":401284,"name":"Михаил Александров","email":"","role":9,"registDate":"1000-01-01T00:00:00","lastDate":"2024-04-21T19:50:04","photo":"users/401284/48171011af39b6bb3a74df8c0fcf97d0.jpg","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"users/401284/200_48171011af39b6bb3a74df8c0fcf97d0.jpg","photoPreview120":"users/401284/120_48171011af39b6bb3a74df8c0fcf97d0.jpg","photoPreview100":"users/401284/100_48171011af39b6bb3a74df8c0fcf97d0.jpg","photoPreview80":"users/401284/80_48171011af39b6bb3a74df8c0fcf97d0.jpg","photoPreview40":"users/401284/40_48171011af39b6bb3a74df8c0fcf97d0.jpg","isPhotoExists":true,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":true},{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-54 мин."},"isBanned":false,"roleString":"Посетитель","roleIcon":"fa-user","socialMedia":[],"aboutText":"","aboutHTML":"","signatureText":"","signatureHTML":"","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":4.987,"absoluteRating":6052,"dynamicRating":222.053,"dynamicRatingStars":7,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-04-30T15:54:59.5222164+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":2,"counters":{"daysAtPortal":2725,"questions":0,"questionsPosts":527,"questionsAnswers":250,"questionsPostsEvaluations":155,"forumPosts":0},"isRfproUserClass":true,"id":400669,"name":"epimkin","email":"","role":1,"registDate":"1000-01-01T00:00:00","lastDate":"2024-02-19T23:46:05","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":false},{"isEmailConfirmed":true,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":3,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"нет адреса","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-54 мин."},"isBanned":false,"roleString":"Посетитель","roleIcon":"fa-user","socialMedia":[],"aboutText":"","aboutHTML":"","signatureText":"[i]С уважением[/i]\n[i]shvetski[/i]","signatureHTML":"\u003Ci\u003EС уважением\u003C/i\u003E\u003Cbr\u003E\u003Ci\u003Eshvetski\u003C/i\u003E","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":4.963,"absoluteRating":11493,"dynamicRating":201.072,"dynamicRatingStars":7,"timezone":{"id":0,"baseUtcOffset":"00:00:00","displayName":"[не установлен]","linuxid":"notset/clean"},"currentDateTime":"2024-04-30T15:54:59.5223891+03:00","isValid":true,"isUnconfirmed":false,"isConfirmed":true,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":2,"counters":{"daysAtPortal":5716,"questions":35,"questionsPosts":1567,"questionsAnswers":588,"questionsPostsEvaluations":324,"forumPosts":44},"isRfproUserClass":true,"id":226425,"name":"Konstantin","email":"","role":1,"registDate":"1000-01-01T00:00:00","lastDate":"2024-04-29T10:52:11","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"red","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isLoggedIn":true,"isNewUser":false,"isExisted":true,"isExpert":false}]
Уважаемые Эксперты! Помогите мне пожалуйста! Я начал изучать Дельфи, и уже немного ее освоил. Заинтересовался редактированием ID3v2 mp3 на Дельфи. Нашел в Сети исходный код и пользуюсь им. Тэг используется как компонент. Все хорошо, только я хотел разобраться как это работает, а заодно и добавить что-нибудь свое (например, в данном исходном коде нет функции редактирования изображения в mp3). Помогите, пожалуйста! Заранее благодарен. В приложении только часть кода, потому что туда больше 12 000 символов не влезет. Остальное пришлю.
const ID3V2_ID='ID3'; ID3V2_FRAME_COUNT=17; ID3V2_FRAME_NEW:array [1..ID3V2_FRAME_COUNT] of string= ('TIT2','TPE1','TALB','TRCK','TYER','TCON','COMM','TCOM','TENC', 'TCOP','TLAN','WXXX','TDRC','TOPE','TIT1','TOAL','TSIZ'); ID3V2_FRAME_OLD:array [1..ID3V2_FRAME_COUNT] of string= ('TT2','TP1','TAL','TRK','TYE','TCO','COM','TCM','TEN', 'TCR','TLA','WXX','TOR','TOA','TT1','TOT','TSI'); ID3V2_MAX_SIZE=4096;
UNICODE_ID=#1;
type
FrameHeaderNew=record ID:array [1..4] of char; Size:integer; Flags:word; end;
FrameHeaderOld=record ID:array [1..3] of char; Size:array [1..3] of byte; end; TagInfo = record ID:array [1..3] of char; Version: byte; Revision: byte; Flags: byte; Size: array [1..4] of byte; FileSize: integer; Frame: array [1..ID3V2_FRAME_COUNT] of string; NeedRewrite: boolean; PaddingSize: integer; end; function ReadHeader(const FileName: WideString; var Tag: TagInfo): boolean; var SourceFile: TFileStream; Transferred: integer; begin try Result:= True; SourceFile:=TFileStream.Create(FileName, fmOpenRead or fmShareDenyWrite); Transferred:=SourceFile.Read(Tag, 10); Tag.FileSize:=SourceFile.Size; SourceFile.Free; if Transferred < 10 then Result:=False; except Result:=False; end; end;
function GetTagSize(const Tag:TagInfo):integer; begin Result := Tag.Size[1]*$200000+Tag.Size[2]*$4000+Tag.Size[3]* $80+Tag.Size[4]+10; if Tag.Flags and $10=$10 then Inc(Result, 10); if Result>Tag.FileSize then Result:= 0; end;
procedure SetTagItem(const ID,Data:string;var Tag:TagInfo); var Iterator:byte; FrameID:string; begin for Iterator:=1 to ID3V2_FRAME_COUNT do begin if Tag.Version>TAG_VERSION_2_2 then FrameID:=ID3V2_FRAME_NEW[Iterator] else FrameID:=ID3V2_FRAME_OLD[Iterator]; if(FrameID=ID)and(Data[1]<=UNICODE_ID) then Tag.Frame[Iterator]:=Data; end; end;
function Swap32(const Figure:integer):integer; var ByteArray: array [1..4] of byte absolute Figure; begin Result:= ByteArray[1]*$1000000+ByteArray[2]*$10000+ByteArray[3]* $100+ByteArray[4]; end;
procedure ReadFramesNew(const FileName:WideString;var Tag:TagInfo); var SourceFile:TFileStream; Frame:FrameHeaderNew; Data:array [1..500] of char; DataPosition,DataSize:integer; begin try SourceFile:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite); SourceFile.Seek(10,soFromBeginning); while(SourceFile.Position<GetTagSize(Tag))and (SourceFile.Position<SourceFile.Size)do begin FillChar(Data,SizeOf(Data),0); SourceFile.Read(Frame,10); if not(Frame.ID[1] in ['A'..'Z']) then break; DataPosition:=SourceFile.Position; if Swap32(Frame.Size)>SizeOf(Data) then DataSize:=SizeOf(Data) else DataSize:=Swap32(Frame.Size); SourceFile.Read(Data,DataSize); if Frame.Flags and $8000<>$8000 then SetTagItem(Frame.ID,Data,Tag); SourceFile.Seek(DataPosition+Swap32(Frame.Size),soFromBeginning); end; SourceFile.Free; except end; end;
Обсуждение
Неизвестный
28.07.2008, 22:27
общий
{А это - остальная часть кода} procedure ReadFramesOld(const FileName:WideString;var Tag:TagInfo); var SourceFile:TFileStream; Frame:FrameHeaderOld; Data:array [1..500] of char; DataPosition,FrameSize,DataSize:integer; begin try SourceFile:=TFileStream.Create(FileName,fmOpenRead or fmShareDenyWrite); SourceFile.Seek(10,soFromBeginning); while (SourceFile.Position<GetTagSize(Tag)) and (SourceFile.Position<SourceFile.Size) do begin FillChar(Data,SizeOf(Data),0); SourceFile.Read(Frame,6); if not (Frame.ID[1] in ['A'..'Z']) then break; DataPosition:=SourceFile.Position; FrameSize:= Frame.Size[1] shl 16+Frame.Size[2] shl 8+Frame.Size[3]; if FrameSize>SizeOf(Data) then DataSize:=SizeOf(Data) else DataSize:=FrameSize; SourceFile.Read(Data,DataSize); SetTagItem(Frame.ID,Data,Tag); SourceFile.Seek(DataPosition+FrameSize,soFromBeginning); end; SourceFile.Free; except end; end;
function GetANSI(const Source:string):string; var Index:integer; FirstByte,SecondByte:byte; UnicodeChar:widechar; begin if (Length(Source)>0) and (Source[1]=UNICODE_ID) then begin Result:=''; for Index:=1 to ((Length(Source) - 1) div 2) do begin FirstByte:=Ord(Source[Index * 2]); SecondByte:=Ord(Source[Index * 2 + 1]); UnicodeChar:=widechar(FirstByte or (SecondByte shl 8)); if UnicodeChar=#0 then break; if FirstByte<$FF then Result:=Result+UnicodeChar; end; Result:=Trim(Result); end else Result:=Trim(Source); end;
function GetContent(const Content1,Content2:string):string; begin Result:=GetANSI(Content1); if Result='' then Result:=GetANSI(Content2); end;
function ExtractTrack(const TrackString:string):word; var Track:string; Index,Value,Code:integer; begin Track:=GetANSI(TrackString); Index:=Pos('/',Track); if Index=0 then Val(Track,Value,Code) else Val(Copy(Track,1,Index-1),Value,Code); if Code=0 then Result:=Value else Result:=0; end;
function ExtractYear(const YearString,DateString:string):string; begin Result:=GetANSI(YearString); if Result='' then Result:=Copy(GetANSI(DateString),1,4); end;
function ExtractGenre(const GenreString:string):string; begin Result:=GetANSI(GenreString); if Pos(')',Result)>0 then Delete(Result,1,LastDelimiter(')',Result)); end;
function ExtractText(const SourceString:string;LanguageID:boolean):string; var Source,Separator:string; EncodingID:char; begin Source:=SourceString; Result:=''; if Length(Source)>0 then begin EncodingID:=Source[1]; if EncodingID=UNICODE_ID then Separator:=#0#0 else Separator:=#0; if LanguageID then Delete(Source,1,4) else Delete(Source, 1, 1); Delete(Source,1,Pos(Separator,Source)+Length(Separator)-1); Result:=GetANSI(EncodingID+Source); end; end;
procedure BuildHeader(var Tag:TagInfo); var Iterator,TagSize:integer; begin TagSize:=10; for Iterator:=1 to ID3V2_FRAME_COUNT do if Tag.Frame[Iterator]<>'' then Inc(TagSize,Length(Tag.Frame[Iterator])+11); Tag.NeedRewrite:=(Tag.ID<>ID3V2_ID)or(GetTagSize(Tag)<TagSize)or (GetTagSize(Tag)>ID3V2_MAX_SIZE); if Tag.NeedRewrite then Tag.PaddingSize:=ID3V2_MAX_SIZE-TagSize else Tag.PaddingSize:=GetTagSize(Tag)-TagSize; if Tag.PaddingSize>0 then Inc(TagSize,Tag.PaddingSize); Tag.ID:= ID3V2_ID; Tag.Version:=TAG_VERSION_2_3; Tag.Revision:=0; Tag.Flags:= 0; for Iterator:=1 to 4 do Tag.Size[Iterator]:=((TagSize-10)shr((4-Iterator)*7)) and $7F; end;
function ReplaceTag(const FileName:WideString;TagData:TStream):boolean; var Destination:TFileStream; begin Result:=False; if (not FileExists(FileName))or(FileSetAttr(FileName,0)<>0) then exit; try TagData.Position:=0; Destination:= TFileStream.Create(FileName,fmOpenReadWrite); Destination.CopyFrom(TagData,TagData.Size); Destination.Free; Result:=True; except
end; end;
function RebuildFile(const FileName:WideString;TagData:TStream):boolean; var Tag:TagInfo; Source,Destination:TFileStream; BufferName:string; begin Result:=False; if (not FileExists(FileName))or(FileSetAttr(FileName,0)<>0) then exit; if not ReadHeader(FileName,Tag) then exit; if (TagData=nil) and (Tag.ID<>ID3V2_ID) then exit; try BufferName:=FileName+'~'; Source:=TFileStream.Create(FileName,fmOpenRead); Destination:=TFileStream.Create(BufferName,fmCreate); if Tag.ID=ID3V2_ID then Source.Seek(GetTagSize(Tag),soFromBeginning); if TagData<>nil then Destination.CopyFrom(TagData,0); Destination.CopyFrom(Source, Source.Size-Source.Position); Source.Free; Destination.Free; if (DeleteFile(FileName)) and (RenameFile(BufferName, FileName)) then Result := True else raise Exception.Create(''); except if FileExists(BufferName) then DeleteFile(BufferName); end; end;
function SaveTag(const FileName:WideString;Tag:TagInfo):boolean; var TagData:TStringStream; Iterator,FrameSize:integer; Padding:array [1..ID3V2_MAX_SIZE] of byte; begin TagData:=TStringStream.Create(''); BuildHeader(Tag); TagData.Write(Tag,10); for Iterator := 1 to ID3V2_FRAME_COUNT do if Tag.Frame[Iterator]<>'' then begin TagData.WriteString(ID3V2_FRAME_NEW[Iterator]); FrameSize := Swap32(Length(Tag.Frame[Iterator])+1); TagData.Write(FrameSize,SizeOf(FrameSize)); TagData.WriteString(#0#0#0+Tag.Frame[Iterator]); end; FillChar(Padding,SizeOf(Padding), 0); if Tag.PaddingSize>0 then TagData.Write(Padding,Tag.PaddingSize); if Tag.NeedRewrite then Result:=RebuildFile(FileName,TagData) else Result := ReplaceTag(FileName,TagData); TagData.Free; end;
procedure TID3v2.FSetTitle(const NewTitle:string); begin FTitle:=Trim(NewTitle); end;
procedure TID3v2.FSetArtist(const NewArtist:string); begin FArtist:=Trim(NewArtist); end;
procedure TID3v2.FSetAlbum(const NewAlbum:string); begin FAlbum:=Trim(NewAlbum); end;
procedure TID3v2.FSetTrack(const NewTrack:word); begin FTrack:=NewTrack; end;
procedure TID3v2.FSetYear(const NewYear:string); begin FYear:=Trim(NewYear); end;
procedure TID3v2.FSetGenre(const NewGenre:string); begin FGenre:=Trim(NewGenre); end;
procedure TID3v2.FSetComment(const NewComment:string); begin FComment:=Trim(NewComment); end;
procedure TID3v2.FSetComposer(const NewComposer:string); begin FComposer:=Trim(NewComposer); end;
procedure TID3v2.FSetEncoder(const NewEncoder:string); begin FEncoder:=Trim(NewEncoder); end;
procedure TID3v2.FSetCopyright(const NewCopyright:string); begin FCopyright:=Trim(NewCopyright); end;
procedure TID3v2.FSetLanguage(const NewLanguage:string); begin FLanguage:=Trim(NewLanguage); end;
function TID3v2.ReadFromFile(const FileName:WideString):boolean; var Tag:TagInfo; begin ResetData; Result:=ReadHeader(FileName,Tag); if (Result) and (Tag.ID=ID3V2_ID) then begin FExists:=True; FVersionID:=Tag.Version; FSize:=GetTagSize(Tag); if (FVersionID in [TAG_VERSION_2_2..TAG_VERSION_2_4]) and (FSize>0) then begin if FVersionID>TAG_VERSION_2_2 then ReadFramesNew(FileName,Tag) else ReadFramesOld(FileName,Tag); FTitle:=GetContent(Tag.Frame[1],Tag.Frame[15]); FArtist:=GetContent(Tag.Frame[2],Tag.Frame[14]); FAlbum:=GetContent(Tag.Frame[3],Tag.Frame[16]); FTrack:=ExtractTrack(Tag.Frame[4]); FTrackString:=GetANSI(Tag.Frame[4]); FYear:=ExtractYear(Tag.Frame[5],Tag.Frame[13]); FGenre:=ExtractGenre(Tag.Frame[6]); FComment:=ExtractText(Tag.Frame[7],True); FComposer:=GetANSI(Tag.Frame[8]); FEncoder:=GetANSI(Tag.Frame[9]); FCopyright:=GetANSI(Tag.Frame[10]); FLanguage:=GetANSI(Tag.Frame[11]); FLink:=ExtractText(Tag.Frame[12], False); FTSIZ:=GetANSI(Tag.Frame[17]); end; end; end;
function TID3v2.SaveToFile(const FileName:WideString):boolean; var Tag:TagInfo; begin FillChar(Tag,SizeOf(Tag),0); ReadHeader(FileName,Tag); Tag.Frame[1]:=FTitle; Tag.Frame[2]:=FArtist; Tag.Frame[3]:=FAlbum; if FTrack>0 then Tag.Frame[4]:=IntToStr(FTrack); Tag.Frame[5]:=FYear; Tag.Frame[6]:=FGenre; if FComment<>'' then Tag.Frame[7]:='eng'+#0+FComment; Tag.Frame[8]:=FComposer; Tag.Frame[9]:=FEncoder; Tag.Frame[10]:=FCopyright; Tag.Frame[11]:=FLanguage; if FLink<>'' then Tag.Frame[12]:=#0+FLink; Result:=SaveTag(FileName,Tag); end;
function TID3v2.RemoveFromFile(const FileName:WideString):boolean; begin Result:=RebuildFile(FileName,nil); end;
end.
Неизвестный
28.07.2008, 22:52
общий
Мне кажется что лучше изучать структуру тегов ID3v2 с помощью оф. документации. Её можно найти на сайте www.id3.org. Правда вся документация на английском языке. Здесь Вы можете найти немного дополнительной информации. Удачи!!!
Айтуган Сарбасов Оё-ёй, как много букв. Лучше дайте в мини-форуме ссылку на компонент, а то Ваше сообщение (да и весь мини-форум из-за него) читать неудобно. Я его удаляю...
Об авторе:
Я только в одном глубоко убеждён - не надо иметь убеждений! :)
Форма ответа
Отправка постов/ответов доступна только зарегистрированным и подтвержденным пользователям.
{"canUserNotesAccess":false,"canUserAdminsNotesAccess":false,"canAskQuestion":false,"canEditQuestions":false,"canSeeQuestionsComplains":false,"isSuperAdmin":false,"isAdmin":false,"isModer":false,"canCreateNewUser":false,"canConfirmUser":false,"canEditUserName":false,"canEditUserRole":false,"canEditUserEmail":false,"canEditUserPhone":false,"canEditUserBirthdate":false,"canEditUserCountry":false,"canEditSocialMedia":false,"canDeleteUserPhoto":false,"canDeleteUser":false,"canEditUserAbout":false,"canBanUser":false,"canResetUserPassword":false,"canEditRegistDate":false,"canChangeUserRating":false,"canAccessToAdmin":false,"canAnnouncements":false,"canManageQuestionPosts":false,"canManageForumSections":false,"canManageForumThreads":false,"canManageForumPosts":false,"canCreateForumThreads":false,"canSeeUserEmail":false,"canSeeUserPhone":false,"canSeeIPAddress":false,"canSeeUserRegistDate":false,"canSeeUserSocialMedia":false,"canSeeBirthDate":false,"canSeeUserCountry":false,"canSeeUserSettings":false,"canSeeDeletedPosts":false,"isEmailConfirmed":false,"tel":"","ip":"0.0.0.0","ipLocation":{"ip":"","sDate":0,"postalCode":"","country":"","countryIsoCode":"","federalDistrict":"","region":"","regionType":"","city":"","cityType":"","geoLat":"","geoLon":"","locationString":""},"birthDate":"0001-01-01T00:00:00","age":0,"isBirthdayToday":false,"ban":{"id":0,"userId":0,"isBanned":false,"startDate":"0001-01-01T00:00:00","endDate":"0001-01-01T00:00:00","moder":{"id":0,"name":"Неизвестный","email":"","role":0,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isValid":false,"isLoggedIn":false,"isUnconfirmed":true,"isConfirmed":false,"isNewUser":false,"isExisted":false,"isExpert":false,"isRfproUserClass":false},"reasonHTML":"","timeToUnbanString":"-54 мин."},"isBanned":false,"roleString":"Неподтвержден","roleIcon":"fa-user-clock","socialMedia":[],"aboutText":"","aboutHTML":"","signatureText":"","signatureHTML":"","country":{"id":0,"name":"","isFlagExists":false,"flagImage":"","isValid":false},"city":{"id":0,"name":"","countryId":0,"yandexCityId":0,"isValid":false},"averageEvaluation":0,"absoluteRating":0,"dynamicRating":0,"dynamicRatingStars":0,"timezone":{"id":283,"baseUtcOffset":"03:00:00","displayName":"(UTC\u002B03:00) Москва","linuxid":"Europe/Moscow"},"currentDateTime":"2024-04-30T18:54:59.5229538+03:00","isValid":false,"isUnconfirmed":true,"isConfirmed":false,"settings":{"fixedHeader":true,"fixedFooter":true,"leftColumnMode":2,"darkTheme":false,"topPanelBtns":[{"id":103,"text":"Главная","title":"Главная (начальная) страница Портала","icon":"fa-solid fa-house-chimney","colorClass":"text-info-emphasis","controller":"Home","action":"Index","accessLevel":0,"isDropdown":false},{"id":100,"text":"Вход в систему","title":"Войти в систему с использованием своих регистрационных данных (адрес электронной почты и пароль)","icon":"fa-solid fa-arrow-right-to-bracket","colorClass":"text-info-emphasis","controller":"Login","action":"Index","accessLevel":0,"isDropdown":false},{"id":101,"text":"Регистрация","title":"Зарегистрироваться в системе и стать полноценным участником сообщества","icon":"fa-solid fa-user-plus","colorClass":"text-info-emphasis","controller":"Regist","action":"Index","accessLevel":0,"isDropdown":false},{"id":102,"text":"Сброс пароля","title":"Сбросить пароль свой учетной записи, если Вы его забыли","icon":"fa-solid fa-key","colorClass":"text-danger-emphasis","controller":"Login","action":"ResetPassword","accessLevel":0,"isDropdown":false}],"topPanelBtnsHideText":false},"isLevelUpAllowed":false,"nextRole":1,"counters":{"daysAtPortal":0,"questions":0,"questionsPosts":0,"questionsAnswers":0,"questionsPostsEvaluations":0,"forumPosts":0},"isRfproUserClass":true,"id":0,"name":"Неизвестный","email":"","role":0,"registDate":"0001-01-01T00:00:00","lastDate":"0001-01-01T00:00:00","photo":"images/unophoto.png?v=9.4.12","lastDateIndicatorClass":"gray","lastDateIndicatorText":"давно","photoPreview200":"images/unophoto.png?v=9.4.12","photoPreview120":"images/unophoto.png?v=9.4.12","photoPreview100":"images/unophoto.png?v=9.4.12","photoPreview80":"images/unophoto.png?v=9.4.12","photoPreview40":"images/unophoto.png?v=9.4.12","isPhotoExists":false,"isLoggedIn":false,"isNewUser":false,"isExisted":false,"isExpert":false}